下に例を載せているが、クラス定義の中で前方宣言したクラスの変数を定義する際は、ポインタやテンプレート変数ならばいいけれども、そのまま使うことはできない。vectorのテンプレート変数にする分には問題ない。
ここらへんはごまかして勉強したのでダメですね。
// case1: OK
class A; // 前方宣言
class B{
A *a;
};
// case2: OK
class A;
class B{
std::vector<A> a;
};
// case3: OK
class A;
template<class T=A>
class B{
T a;
};
// case4: NG
class A;
class B{
A a;
};