3

私は多くの記事を読んで、メンバーテンプレートを特殊化するときにクラステンプレートの場合、特殊化されたメンバーテンプレートを含むクラスも明示的に特殊化する必要があることを読みました。標準でそれについてのポイントはありますか?また、そのような制限を設ける理由はありますか? つまり、ボンネットの下です。

これが許可されない理由。

template <typename T>
class A
{
   template <typename U>
   void foo()
   {}
};

template <typename T>
 template <>
void A<T>::foo<int>()
{}
4

1 に答える 1

1

[temp.expl.spec]/16:

クラス テンプレートのメンバーまたは名前空間スコープに表示されるメンバー テンプレートの明示的な特殊化宣言では、メンバー テンプレートとその外側のクラス テンプレートの一部は、特殊化されていないままになる場合があります。囲んでいるクラス テンプレートも明示的に特殊化されていません。例:

template <class T1> class A {
    template<class T2> class B {
        template<class T3> void mf1(T3);
        void mf2();
    };
};

template <> template <class X>
class A<int>::B {
    template <class T> void mf1(T);
};

template <> template <> template<class T>
void A<int>::B<double>::mf1(T t) { }
template <class Y> template <>
void A<Y>::B<double>::mf2() { } // ill-formed; B<double> is specialized 
                                // but its enclosing class template A is not

終了例]

于 2015-01-12T19:31:28.910 に答える