以下は私にいくつかのコンパイルエラーを与えます:
error C2995: 'void A<T>::B<Q>::func(void)' : function template has already been defined
error C3855: 'A<T>::B<Q>': template parameter 'Q' is incompatible with the declaration
クラス宣言に定義を持たずにこれを行うにはどうすればよいですか?
template<typename T>
struct A
{
template<typename Q>
struct B
{
void func();
};
};
template<typename T>
template<typename Q>
void A<T>::B<Q>::func()
{
}
template<typename T>
template<>
void A<T>::B<int>::func()
{
}
編集:
14.7.3 §16 によると、ネストされたクラス テンプレートは、それを囲んでいるクラス テンプレートも特殊化されていない場合、特殊化できません。ただし、次のように外部クラス宣言内で完全に定義されている場合、ネストされたクラスの特殊化が機能するのはなぜでしょうか。
template<typename T>
struct A
{
template<typename Q>
struct B
{
void func(){}
};
template<>
struct B<int>
{
void func(){}
};
};
おそらく、これはVS2010だけで、できないはずのことをできるようになっているのでしょうか?