明示的特殊化クラスのメンバーは、
主テンプレートのメンバー宣言から暗黙的にインスタンス化されることはありません。
クラス・テンプレート特殊化のメンバーを明示的に定義する必要があります。
明示的特殊化テンプレート・クラスのメンバーを、template<> 接頭部を使用せずに、
標準クラスのメンバーを定義するのと同じように定義します。
さらに、明示的特殊化のメンバーをインラインに定義できます。
ここでは、特別なテンプレート構文は使用されていません。
次の例は、クラス・テンプレート特殊化を示しています。
template<class T> class A { public: void f(T); }; template<> class A<int> { public: int g(int); }; int A<int>::g(int arg) { return 0; } int main() { A<int> a; a.g(1234); }
明示的特殊化 A<int> は、メンバー関数 g() を含んでいますが、 主テンプレートは、これを含んでいません。
テンプレート、メンバー・テンプレート、またはクラス・テンプレートのメンバーを明示的に特殊化する場合、 この特殊化を宣言してから、特殊化のインスタンスを暗黙的に生成する必要があります。 例えば、コンパイラーは、次のコードを許可しません。
template<class T> class A { }; void f() { A<int> x; } template<> class A<int> { }; int main() { f(); }
コンパイラーは、関数 f() が、特殊化の前に、 この特殊化 (x の構造体にある) を使用するので、 明示的特殊化 template<> class A<int> { }; を許可しません。
関連参照