1

Base 型のポインターと他のすべてのポインター型に対して異なる動作をさせるために、テンプレート クラスを特殊化したいと考えています。enable if を使ってみました。しかし、それは私が望むようには機能していません。どうすればいいのか誰か教えてください。私が試したコード:

class Base
{
};

class Derived:public Base
{
};

class Non_base
{
};

template<class T,class Enable=void> class Vector
{
public:
    Vector()
    {
        cout<<"Constructor of Vector "<<endl;
    }
};



template<class T> class Vector<T*>
{
public:
    Vector()
    {
        cout<<"Constructor of Vector<T *> "<<endl;
    }
};



template<> class Vector<Base*>
{
public:
    Vector()
    {
        cout<<"Constructor of Vector<Base*> fully specialized"<<endl;
    }
};


//template<class T> class Vector<T *>:public Vector<Base *>
//{
//public:
//    Vector()
//    {
//        cout<<"Constructor of Vector<Base*> partially specilized"<<endl;
//    }
//};


template<class T> class Vector<T*,typename enable_if<is_base_of<Base,T>::value>::type>
{
    Vector()
    {
        cout<<"Constructor of Vector<Base*> partially specilized"<<endl;
    }
};
4

1 に答える 1

3

enable_if既存のオーバーロード セットのサブセットに追加するときは、通常、それを残りのメンバーにも追加する必要があります。一部のオーバーロードが有効になっている場合、他のオーバーロードを無効にする必要があります。そうしないと、あいまいさが生じます。

template<class T> class Vector<T*,typename enable_if<!is_base_of<Base,T>::value>::type>
{
public:
    Vector()
    {
        cout<<"Constructor of Vector<T *> "<<endl;
    }
};

enable_if<!…&gt;完全な専門化はすでにセットのベスト マッチであるため、あいまいさはあり得ないため、追加する必要はありません。

于 2013-02-11T05:11:18.053 に答える