明示的特殊化のクラス・メンバー

C++明示的特殊化クラスのメンバーは、 主テンプレートのメンバー宣言から暗黙的にインスタンス化されることはありません。 クラス・テンプレート特殊化のメンバーを明示的に定義する必要があります。 明示的特殊化テンプレート・クラスのメンバーを、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> { }; を許可しません。

関連参照

IBM Copyright 2003