9

私は私ができることを知っています

class Foo;

そしておそらく

struct Bar;

およびグローバル関数

bool IsValid(int iVal);

型付き列挙型はどうですか?宣言されていないクラス内の型付き列挙型はどうですか?宣言されていないクラスを持つ関数はどうですか?宣言されていないクラス内の静的メンバーはどうですか?未知の名前空間内のこれらはどうですか?前方宣言できるものが他にありませんか?

4

1 に答える 1

13

前方宣言できます

  • 部分的な専門分野を含むテンプレート
  • 明示的な専門分野
  • ネストされたクラス(これには、構造体、「実際の」クラス、およびユニオンが含まれます)
  • ネストされていないローカルクラス
  • 変数( "extern int a;")
  • 関数

「前方宣言」が厳密に「宣言するが定義しない」ことを意味する場合は、メンバー関数を前方宣言することもできます。ただし、一度宣言すると、クラス定義で再宣言することはできません。列挙を前方宣言することはできません。何かを逃したかどうかはわかりません。

上記のすべての前方宣言は、部分的および明示的な特殊化を除いて、非修飾名を使用して宣言する必要があり、メンバー関数とネストされたクラスは、クラス定義でのみ宣言できますが、定義できないことに注意してください。

class A { };
class A::B; // not legal

namespace A { }
void A::f(); // not legal

namespace A { void f(); } // legal

class B { class C; }; // legal
class B::C; // declaration-only not legal

class D { template<typename T> class E; };
template<typename T> class D::E<T*>; // legal (c.f. 14.5.4/6)
于 2010-09-26T21:17:17.930 に答える