コンパイラ エラー C2512
'identifier' : クラス、構造体、共用体に既定のコンストラクターがありません
既定のコンストラクター (引数を必要としないコンストラクター) は、指定されたクラス、構造体、または共用体では使用できません。 ユーザー定義のコンストラクターが指定されていない場合のみ、コンパイラによって既定のコンストラクターが提供されます。
void 以外のパラメーターを受け取るコンストラクターを指定し、パラメーターを指定しない (たとえば、配列の要素として) クラスを作成する場合は、既定のコンストラクターも指定する必要があります。 既定のコンストラクターには、すべてのパラメーターに既定値を使用したコンストラクターを指定できます。
例
エラー C2512 の一般的な原因は、引数を受け取るクラスまたは構造体コンストラクターを定義し、引数を指定せずにクラスまたは構造体のインスタンスを宣言しようとした場合です。 たとえば、struct B
では char *
引数を必要とするコンストラクターを宣言しますが、引数を受け取らないコンストラクターは宣言していません。 main
では、B のインスタンスが宣言されますが、引数は指定されていません。 コンパイラでは、B の既定のコンストラクターが見つからないので、C2512 が生成されます。
// 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) {}
などの既定値が含まれるコンストラクターを定義します。