12

重複の可能性:
テンプレート化されたクラスでのテンプレート化されたメンバー関数の特殊化

template <class T>    
class MyClass
{
   template <int N>
   void func() {printf("unspecialized\n");}
};
template<class T>
template<>
MyClass<T>::func<0>()
{
   printf("specialzied\n");
}

これは動作しません。テンプレートクラスのテンプレートメソッドを特殊化することは可能ですか?

4

1 に答える 1

23

要求どおりに行うことはできません。何らかの理由で(理論的根拠についてはわかりません)、メンバーテンプレートの明示的な(つまり完全な)特殊化は、囲んでいるクラスも明示的に(つまり完全に)特殊化されている場合にのみ許可されます。この要件は、言語標準で明示的に説明されています(C++98の14.7.3/18、C ++ 03、およびC++11の14.7.3/16を参照)。

同時に、メンバークラステンプレートの部分的な特殊化が許可されます。これは、多くの場合、回避策として使用できます(醜いものですが)。ただし、明らかに、これはメンバークラステンプレートにのみ適用できます。メンバー関数テンプレートに関しては、別のソリューションを使用する必要があります。

たとえば、考えられる回避策は、呼び出しをテンプレートクラスの静的メンバーに委任し、代わりにクラスを特殊化することです(これは、関数テンプレートの特殊化よりも優れたアイデアとして推奨されることがよくありますhttp://www.gotw.ca/publications/ mill17.htm

template <class T>    
class MyClass
{
   template <int N, typename DUMMY = void> struct Func {
     static void func() { printf("unspecialized\n"); }
   };

   template <typename DUMMY> struct Func<0, DUMMY> {
     static void func() { printf("specialized\n"); }
   };

   template <int N> void func() { Func<N>::func(); }
};
于 2012-04-16T17:29:43.713 に答える