Earwicker が以前に回答したように、コンパイラはクラスのサイズを知る必要があるため、これらのケースでは前方宣言を使用できません。
前方宣言は一連の操作でのみ使用できます。
- 前方宣言されたクラスをパラメーターとして受け取るか、それを返す宣言関数
- 前方宣言されたクラスへのメンバー ポインターまたは参照の宣言
- クラス定義で前方宣言型の静的変数を宣言する
あなたはそれを使用することはできません
- 指定された型のメンバー属性を宣言します (コンパイラにはサイズが必要です)
- タイプのオブジェクトを定義または作成するか、削除します
- クラスの任意の静的メソッドまたはメンバー メソッドを呼び出すか、任意のメンバーまたは静的属性にアクセスします
(私は何かを忘れましたか?)
auto_ptr
anの宣言は生のポインターの宣言と同じではないことを考慮してauto_ptr
ください。これは、ポインターがスコープ外になるとインスタンス化によってポインターが削除され、削除するには型の完全な宣言が必要になるためです。in を使用しauto_ptr
て前方宣言された型を保持する場合は、(空の場合でも) デストラクタを提供し、完全なクラス宣言が表示された後に定義する必要があります。
他にもいくつかの微妙な点があります。クラスを前方宣言すると、それがクラスになることをコンパイラに伝えます。これは、別の型に anenum
または aを指定できないことを意味します。これは、テンプレートの特定のインスタンス化の typedef であるため、typedef
declare を転送しようとしたときに発生する問題です。std::string
typedef basic_string<char> string; // aproximate
文字列を前方宣言するには、basic_string
テンプレートを前方宣言してからtypedef
. 問題は、テンプレートが取るパラメーターの数を標準が述べていないことです。複数のパラメーターをbasic_string
取る場合、上記の式がコンパイルされるように、残りのパラメーターにはデフォルトの型が必要であると述べているだけです。これは、テンプレートを前方宣言するための標準的な方法がないことを意味します。
一方、非標準テンプレート (非 STL、つまり非 STL) を前方宣言する場合は、パラメーターの数がわかっている限り、それを行うことができます。
template <typename T, typename U> class Test; // correct
//template <typename T> class Test; // incorrect even if U has a default type
template <typename T, typename U = int> class Test {
// ...
};
最後に、Roddy からあなたに与えられたアドバイスは次のとおりです。できるだけ多くのことを前向きに宣言しますが、いくつかのことを含める必要があると想定してください。