2011-11-09 7 views
16

C++のクラス定義の時点で不完全な型の静的フィールドを宣言していますか?たとえば:不完全な型の静的フィールド - それは合法ですか?

がfoo.h:

class Foo 
{ 
public: 
    // ... 
private: 
    class Bar; 
    static Bar something; 
}; 

Foo.cpp:

class Foo::Bar 
{ 
    // ... 
}; 

Foo::Bar Foo::something; 

// some more code 

コンパイラはそれを受け入れているようだ、と私はそれがあるべき理由が表示されませんそのような状況については、標準は何を言いますか?私は本当に誰かが標準から、おそらくは "古い"もの(2003年のもの)から直接引用を与えることに感謝します。

答えて

13

はい、あなたのやっていることは特に許可されています(§9.4.2/ 2): "クラス定義内の静的データメンバーの宣言は定義ではなく、cv-認定された無効。

2

私は標準から引用することはできませんが、私はあなたに "コンパイラのように考える"というアドバイスを与えることができます。

somethingを宣言している時点で、コンパイラはその型について何を知る必要がありますか?それが通常のメンバだった場合、クラス定義にクラスを含めることができるようにサイズを知る必要がありますが、そのメンバはクラスの一部ではないため、静的メンバには当てはまりません。クラス構築の一環として構築されないため、構築方法を知る必要はありません。コンパイラが宣言された時点でその静的クラスについて知る必要のあるものはまったくないので、前方宣言はうまくいきます。

+1

である。だから私は「私はそれが拒否されるべき理由はない」と言ったのです。私はあなたが書いたことを知っていますが、標準が何らかの理由でそのようなコードを禁止していないかどうかは分かりませんでした(それはC++だから、決して確信できません)。さらに、私はここで最初の質問をしなければならなかった;) – Fanael

関連する問題