http://fonlake.blogspot.com/2009/05/c.html
上記のサイトによると、
class A;
class B{
A a;
};
これは駄目なのだそうですが、何故なのですか?
テンプレートを間に はさめば解決するようですが、結果的には同じことなのに、どうしてコンパイルが通ったり通らなかったりするのか納得できません。
ご教授よろしくお願い致します。
前方宣言したクラス・構造体の使用方法に関して
Re: 前方宣言したクラス・構造体の使用方法に関して
class A;
↑この宣言は不完全型の宣言です。
これだとAクラスのサイズが分からないので、Aクラス型のメンバを含むBクラスのサイズを計算することもできなくてコンパイルエラーになります。
Aクラス型のポインタや参照をメンバにする場合は、実体のサイズは関係ないのでコンパイルが通ります。
C++の前方宣言(前方参照)は不完全型とは別のことなのでリンク先の記事は用語の使い方が間違っていると思います。
(追記)
テンプレートをはさんでも、Bのインスタンスを作るコードでコンパイルエラーになるので解決ではない気がします。
↑この宣言は不完全型の宣言です。
これだとAクラスのサイズが分からないので、Aクラス型のメンバを含むBクラスのサイズを計算することもできなくてコンパイルエラーになります。
Aクラス型のポインタや参照をメンバにする場合は、実体のサイズは関係ないのでコンパイルが通ります。
C++の前方宣言(前方参照)は不完全型とは別のことなのでリンク先の記事は用語の使い方が間違っていると思います。
(追記)
テンプレートをはさんでも、Bのインスタンスを作るコードでコンパイルエラーになるので解決ではない気がします。
- MoNoQLoREATOR
- 記事: 284
- 登録日時: 15年前
- 住所: 東京
Re: 前方宣言したクラス・構造体の使用方法に関して
>>ISLeさん
ありがとうございます。それはわかるのですが、
class A;
template<class T=A>
class B{
T a;
};
とした場合にコンパイルが通るのは何故ですか?
ありがとうございます。それはわかるのですが、
class A;
template<class T=A>
class B{
T a;
};
とした場合にコンパイルが通るのは何故ですか?
Re: 前方宣言したクラス・構造体の使用方法に関して
テンプレートを書いただけでは実体化されないのでエラーにはならないですが、
B<> foo;
B<A> foo;
のようにclass Aを使うことを指定したコードを書けば実体化してエラーになります。
B<> foo;
B<A> foo;
のようにclass Aを使うことを指定したコードを書けば実体化してエラーになります。
- MoNoQLoREATOR
- 記事: 284
- 登録日時: 15年前
- 住所: 東京