クラス・テンプレートを宣言してから、対応するテンプレート・クラスの宣言を行う必要があります。
クラス・テンプレートの定義は、どの変換単位でも 1 回しか現れません。クラス・テンプレートは、クラスのサイズを必要とする、またはクラスのメンバーを参照する、
テンプレート・クラスを使用する前に定義する必要があります。
次の例では、クラス・テンプレート key は、定義の前に宣言されます。 クラスのサイズは必要ないので、ポインター keyiptr の宣言は有効です。 ただし、keyi の宣言はエラー になります。
template <class L> class key; // class template declared, // not defined yet // class key<int> *keyiptr; // declaration of pointer // class key<int> keyi; // error, cannot declare keyi // without knowing size // template <class L> class key // now class template defined { /* ... */ };
クラス・テンプレートを定義する前に、対応するテンプレート・クラスを使用すると、 コンパイラーはエラーを発行します。 テンプレート・クラス名の外観を持つクラス名は、テンプレート・クラスであると見なされます。 言い換えれば、テンプレート・クラスの場合は、不等号括弧が有効なのは、クラス名の中だけです。
先の例では、詳述型指定子 class を使用して、クラス・テンプレート key およびポインター keyiptr を宣言します。keyiptr の宣言は、詳述型指定子なしで行うこともできます。
template <class L> class key; // class template declared, // not defined yet // key<int> *keyiptr; // declaration of pointer // key<int> keyi; // error, cannot declare keyi // without knowing size // template <class L> class key // now class template defined { /* ... */ };
関連参照