前方宣言したクラス・構造体の使用方法に関して

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
MoNoQLoREATOR
記事: 284
登録日時: 15年前
住所: 東京

前方宣言したクラス・構造体の使用方法に関して

#1

投稿記事 by MoNoQLoREATOR » 14年前

http://fonlake.blogspot.com/2009/05/c.html

上記のサイトによると、
class A;

class B{
A a;
};
これは駄目なのだそうですが、何故なのですか?

テンプレートを間に はさめば解決するようですが、結果的には同じことなのに、どうしてコンパイルが通ったり通らなかったりするのか納得できません。

ご教授よろしくお願い致します。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: 前方宣言したクラス・構造体の使用方法に関して

#2

投稿記事 by ISLe » 14年前

class A;
↑この宣言は不完全型の宣言です。
これだとAクラスのサイズが分からないので、Aクラス型のメンバを含むBクラスのサイズを計算することもできなくてコンパイルエラーになります。
Aクラス型のポインタや参照をメンバにする場合は、実体のサイズは関係ないのでコンパイルが通ります。

C++の前方宣言(前方参照)は不完全型とは別のことなのでリンク先の記事は用語の使い方が間違っていると思います。

(追記)
テンプレートをはさんでも、Bのインスタンスを作るコードでコンパイルエラーになるので解決ではない気がします。

アバター
MoNoQLoREATOR
記事: 284
登録日時: 15年前
住所: 東京

Re: 前方宣言したクラス・構造体の使用方法に関して

#3

投稿記事 by MoNoQLoREATOR » 14年前

>>ISLeさん
ありがとうございます。それはわかるのですが、

class A;

template<class T=A>
class B{
T a;
};

とした場合にコンパイルが通るのは何故ですか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 前方宣言したクラス・構造体の使用方法に関して

#4

投稿記事 by h2so5 » 14年前

テンプレートを書いただけでは実体化されないのでエラーにはならないですが、
B<> foo;
B<A> foo;
のようにclass Aを使うことを指定したコードを書けば実体化してエラーになります。

アバター
MoNoQLoREATOR
記事: 284
登録日時: 15年前
住所: 東京

Re: 前方宣言したクラス・構造体の使用方法に関して

#5

投稿記事 by MoNoQLoREATOR » 14年前

>>h2so5さん
あ。本当ですね。

ということはリンク先のサイトは『前方宣言』のみを焦点として書かれているだけであって、下記のような相互に参照し合うようなケースを想定して書かれているわけではないということですね。

コード:

class A;

template<class X=A>
class B{
	X a;
};

class A{
	B<A> b;
};

void main(){
	B<A> b;
}

閉鎖

“C言語何でも質問掲示板” へ戻る