编译器错误 C2512
“identifier”:没有合适的默认构造函数可用
“默认构造函数”(不需要参数的构造函数)不适用于指定的类、结构或联合。 只有在未提供用户定义的构造函数的情况下,编译器才会提供默认构造函数。
如果提供一个采用非 void 参数的构造函数,并且希望允许创建不带参数的类(例如,作为数组的元素),还必须提供默认构造函数。 默认构造函数可以是一个所有参数都使用默认值的构造函数。
示例
错误 C2512 的常见原因是,定义采用参数的类或结构构造函数,然后尝试声明一个不带任何参数的类或结构的实例。 例如,下面的 struct B
声明一个需要 char *
参数的构造函数,但不是一个不采用任何参数的构造函数。 在 main
中,声明 B 的一个实例,但没有提供参数。 编译器生成 C2512 是因为它找不到 B 的默认构造函数。
// C2512.cpp
// Compile with: cl /W4 c2512.cpp
// C2512 expected
struct B {
B (char *) {}
// Uncomment the following line to fix.
// B() {}
};
int main() {
B b; // C2512 - This requires a default constructor
}
可以通过为结构或类定义默认构造函数(例如 B() {}
)或所有参数都具有默认值的构造函数(例如 B (char * = nullptr) {}
)来解决此问题。