2009年5月25日月曜日

C++の前方宣言

C++には前方宣言というのがあって、うまく使うとヘッダファイルのインクルード関係を整理できる。なんとなく使っていたが、今日一つはまった点をメモ。

下に例を載せているが、クラス定義の中で前方宣言したクラスの変数を定義する際は、ポインタやテンプレート変数ならばいいけれども、そのまま使うことはできない。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;
};

2 件のコメント:

okdshin さんのコメント...

はじめまして。
case2は確かにそれ単体ではコンパイルは通るのですが、実際に他のファイルでテンプレートを実体化するときにコンパイルエラーが起こるようです。
使用したコンパイラはgcc4.6.2です。

ztw さんのコメント...

情報ありがとうございます。また自分でも確認してみます。