エラーになるのは何故?(デフォルトコンストラクタの合成)
コード(1)
// main.cpp struct A { A (int a) { } }; int main() { A a; }
コンパイルエラー
$ g++ main.cpp main.cpp: In function 'int main()': main.cpp:12: error: no matching function for call to 'A::A()' main.cpp:5: note: candidates are: A::A(int) main.cpp:4: note: A::A(const A&)
コード(2)
// main.cpp struct A { A (int a) { } }; struct B { A a; }; int main() { B b; }
コンパイルエラー
$ g++ main.cpp main.cpp: In constructor 'B::B()': main.cpp:11: error: no matching function for call to 'A::A()' main.cpp:5: note: candidates are: A::A(int) main.cpp:4: note: A::A(const A&) main.cpp: In function 'int main()': main.cpp:17: note: synthesized method 'B::B()' first required here
コード(3)
// main.cpp struct A { A (int a) { } }; struct B : A { }; int main() { B b; }
コンパイルエラー
$ g++ main.cpp main.cpp: In constructor 'B::B()': main.cpp:12: error: no matching function for call to 'A::A()' main.cpp:5: note: candidates are: A::A(int) main.cpp:4: note: A::A(const A&) main.cpp: In function 'int main()': main.cpp:17: note: synthesized method 'B::B()' first required here
答え
デフォルトコンストラクタがないから
解説
クラスにコンストラクタがない場合は、デフォルトコンストラクタがコンパイラによって合成される。しかし、以下のような場合にデフォルトコンストラクタは合成されない。
- 明示的に定義されたデフォルトコンストラクタ以外のコンストラクタが 1 つ以上あるクラス ... コード(1)
- デフォルトコンストラクタを持たないクラス型のメンバ変数を持つクラス ... コード(2)
- デフォルトコンストラクタを持たないクラス型を継承するクラス ... コード(3)
デフォルトコンストラクタを持たないメリットはあまりない。そのため、空という意味を持つ特殊なオブジェクトを生成するためのデフォルトコンストラクタを別途宣言したりすることが多い。
デフォルトコンストラクタがないとできないことは、関連エントリを参照。