错误 C2512:没有合适的默认构造函数可用(不是类)

Posted

技术标签:

【中文标题】错误 C2512:没有合适的默认构造函数可用(不是类)【英文标题】:error C2512: no appropriate default constructor available (not classes) 【发布时间】:2013-11-19 23:21:49 【问题描述】:

我从结构开始,但在动态分配结构数组时遇到问题。我正在做我在书中和互联网上看到的事情,但我做错了。

这是两个完整的错误消息:

C2512:“记录”:没有合适的默认构造函数可用

IntelliSense:“记录”类不存在默认构造函数

#include <iostream>
#include <string>
using namespace std;

const int NG = 4; // number of scores

struct Record

    string name;  // student name
    int scores[NG];
    double average;

    // Calculate the average
    // when the scores are known
    Record(int s[], double a)
    
        double sum = 0;

        for(int count = 0; count != NG; count++)
        
            scores[count] = s[count];
            sum += scores[count];
        

        average = a;
        average = sum / NG;
    
;

int main()

    // Names of the class
    string names[] = "Amy Adams", "Bob Barr", "Carla Carr",
                      "Dan Dobbs", "Elena Evans";

    // exam scores according to each student
    int exams[][NG]=   98, 87, 93, 88,
                        78, 86, 82, 91,
                        66, 71, 85, 94,
                        72, 63, 77, 69,
                        91, 83, 76, 60;

    Record *room = new Record[5];


    return 0;

【问题讨论】:

如果你认为这个不会尝试调用Record类的默认构造函数,那你就错了:Record *room = new Record[5]; 【参考方案1】:

错误很明显。当您尝试分配数组时:

Record *room = new Record[5];

必须实现默认构造函数,即 Record::Record(),以便可以创建 5 个 Record 实例:

struct Record

    ...
    Record() : average(0.0)  
    Record(int s[], double a)  ... 
;

另外请注意,动态分配是您希望在 C++ 中尽可能避免的事情(除非您有充分的理由这样做)。在这种情况下,改用std::vector 会更合理:

std::vector<Record> records(5);

【讨论】:

谢谢!我会赞成,但我没有足够的声誉。 @SoloMael:呵呵。没关系。我很高兴能帮上忙:)

以上是关于错误 C2512:没有合适的默认构造函数可用(不是类)的主要内容,如果未能解决你的问题,请参考以下文章

错误 C2512 但我有可用的默认构造函数

error C2512: 没有合适的默认构造函数可用

错误 C2512 没有合适的默认构造函数,即使我有一个?

错误 C2512:没有适当的默认构造函数可用 - 为啥在构造函数中初始化属性?

复制构造函数没有合适的默认构造函数

使用模板时缺少默认构造函数