akasaka_34の日記

ネトウヨと呼ばれた男の日記。しかし頻度から言えば週報ぐらい。

フィールドは不完全な型を持っています

g++で

class Foo {
public:
class Bar {
public:
Foo x;
};
};
をコンパイルしようとすると

field ‘x’ has incomplete type

って怒られる。
「サイズが分からんのに(ポインタ以外で)使うな」
ってことだろうけど、その一方で

template  class Foo {
public:
class Bar {
public:
Foo x;
};
};
こう書くと問題ない。
テンプレートクラスはどうせ定義だけじゃサイズが分からないから
サイズが分からないなりに使えなきゃ困るんだけど
んじゃあ普通のクラスも同じように使わせろよ!
と思う。

後方互換性の問題なのかな。

補足:
クラスを分ければ良いというコメントを頂いて
まあ上記のコードに関しては、その通りなのだけど
ちょっと補足しておきます。
あるテンプレートクラスを修正しているうちに
テンプレートである必要がなくなって
テンプレートじゃなくしたら、上記のエラーに遭遇。
「っええ?テンプレートやめたいだけなのに
いろいろ弄らないとコンパイル通らねえの!?」
というお話。