これをまったくコンパイルできません。できないかもしれませんが、なぜできないのかわかりません。
class A {
template <typename T>
class B {
int test() { return 0; }
};
//template <> class B<int>; <-with this, namepace error
B<int> myB_;
};
template <> class A::B<int> {
int test() {
return 1;
}
};
コンパイラは、「明示的な特殊化 "class A::B" は、使用する前に宣言する必要があります」と不平を言っているようです。コメント行で前方宣言を提供しようとすると、コンパイラは「明示的な特殊化 "B" は、テンプレートを含む名前空間で宣言する必要があります」と文句を言います。ここでは 2 つの異なるコンパイラを使用します。このエラーは、AIX 上の IBM の "xl" コンパイラによるものですが、Sun システムでコンパイルすると、異なる表現で同様のエラーが発生します。キャッチ22のようです。
明らかに、これは非常に不自然で単純化された例ですが、問題を表しています。テンプレート クラスはそれを含むクラスにのみ関連するため、クラス内でテンプレート クラスを定義したいと考えています。クラス外からテンプレートにアクセスすることはできません。
何か不足していますか?