エラーになるのは何故?(デフォルトコンストラクタの呼び出し)

コード(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)
    {
    }
};

int main()
{
    A* a = new A[10];
    delete[] 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&)

コード(3)

// main.cpp

struct A
{
    A(int a)
    {
    }
};

int main()
{
    A a[10];
}

コンパイルエラー

$ 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&)

コード(4)

// main.cpp

#include <vector>

struct A
{
    A(int a)
    {
    }
};

int main()
{
    std::vector<A> a(10);
}

コンパイルエラー

$ g++ main.cpp 
main.cpp: In constructor 'std::vector<_Tp, _Alloc>::vector(size_t, const _Tp&, const _Alloc&) [with _Tp = A, _Alloc = std::allocator<A>]':
main.cpp:14: error: no matching function for call to 'A::A()'
main.cpp:7: note: candidates are: A::A(int)
main.cpp:6: note:                 A::A(const A&)

答え

クラス A がデフォルトコンストラクタを持たないから

解説

クラスがデフォルトコンストラクタを持たない場合、以下のことができなくなる。

  • 変数の引数なしの初期化 ... コード(1)
  • 配列の動的割り付け ... コード(2)
  • 配列初期化子無しの、静的配列の定義 ... コード(3)
  • vector などの大きさを取るコンストラクタ .. コード(4)

コード (3) のような場合は、以下のように配列初期化子を用いることで静的配列の定義が可能である。

// main.cpp

struct A
{
    A(int a)
    {   
    }   
};

int main()
{
    A a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
}