明示的特殊化クラスの定義は、主テンプレートの定義とは無関係です。
特殊化を定義するために、主テンプレートを定義する必要はありません
(または、主テンプレートを定義するために、特殊化を定義する必要もありません)。
例えば、コンパイラーは、次のコードを許可します。
template<class T> class A; template<> class A<int>; template<> class A<int> { /* ... */ };
主テンプレートは定義されませんが、明示的特殊化は定義されます。
宣言はされているが、不完全なクラスと同じように定義されていない、明示的特殊化の名前を使用できます。 次の例は、このことを示しています。
template<class T> class X { }; template<> class X<char>; X<char>* p; X<int> i; // X<char> j;
コンパイラーは、X<char> の明示的特殊化が定義されていないので、 X<char> j の宣言を許可しません。
関連参照