囲んでいるクラスも特殊化されていない限り、クラス テンプレート メンバー関数の特殊化は C++ 内では合法ではないという StackOverflow の投稿を多数見てきました。
ただし、次のように、特殊化された関数の定義がテンプレートクラスのクラス宣言内にある限り、メンバーテンプレート関数を特殊化することが可能であることを別の投稿が示しているようです。
template<typename T1, typename T2>
class A
{
public:
template<typename TX> TX foo() {return 0;};
template<> T1 foo<T1>() {return 1;}; // provide the specialization's definition within the class declaration: works
//template<> T1 foo<T1>(); // ... switch to this (and provide the definition below), and it's a compile error
};
// This function definition is only present when the commented-out line of code in the class declaration is used
template<typename T1, typename T2>
template<>
T1 A<T1, T2>::foo<T1>()
{
return 1;
}
int main(void)
{
A<int, double> a;
const int n = a.foo<int>(); // When the definition appears inside the class declaration, n is 1 - it works
return 0;
}
私のコード サンプルのコメントからわかるように、特殊な関数の定義がクラス宣言内で提供されると、コードはエラーなしでビルドされ、さらに正常に実行され、 n
in functionの値main()
は1
予想どおり です。
ただし、特殊な関数定義をクラス宣言の外に移動するが、それ以外は同じままにすると、示されているように、コンパイラーは他の投稿が既に指摘したエラーを出力します。私の場合(Visual Studio 2010)、エラーはan explicit specialization of a template member must be a member of an explicit specialization
.
私の質問はこれです。外側のテンプレート クラスも特殊化されていない限り、クラス テンプレート内のメンバー関数の明示的な特殊化が許可されていない場合、定義がクラス宣言内で提供されている場合、サンプル コードで機能するのはなぜですか?