ここで、stackoverflow でいくつかのコメントを見つけました (たとえば、この質問に関するjrokのコメントを参照)。以下の例のように、(明示的な特殊化とは対照的に) クラス メンバー テンプレートの部分的な特殊化が非名前空間スコープで許可されていることを示しています。
class A {
template <class T, class U>
class B {};
template <class U>
class B<void, U> {};
};
また、この例は gcc と clang の両方で問題なくコンパイルされます。ただし、c++03 標準テキストでは、この問題について 14.5.4 [temp.class.spec] §6 (または c++11 では 14.5.5 §5) しか見つかりません。
クラス テンプレートの部分的な特殊化は、その定義が定義されている任意の名前空間スコープで宣言または再宣言できます (14.5.1 および 14.5.2)。
次の例とともに:
template<class T> struct A {
class C {
template<class T2> struct B { };
};
};
// partial specialization of A<T>::C::B<T2>
template<class T> template<class T2>
struct A<T>::C::B<T2*> { };
では、名前空間以外のスコープでのクラス テンプレートの部分的な特殊化はどうでしょうか。それらは標準で許可されていますか?また、関連するテキストはどこにありますか?
具体的には、私の例は有効ですか (囲んでいるクラスがテンプレートである場合でも有効でしょうか)? そうでない場合、現在のコンパイラは上記のように私の例をコンパイルするのは間違っていますか?