4

ネストされたクラスの特性テンプレートを特殊化する方法はありますか? 以下に示す 3 つの場所で試してみましたが、それぞれに指定されたエラーがあります。ネストされたテンプレート クラスの特殊化に関する質問を見てきましたが、それはここでやろうとしていることではありません。ネストされたクラスで使用される特性クラスを特殊化しようとしています。

TraitUser クラスは、特定の型 T に特化したものとして Trait 内の定義を利用します。おそらく最も関連するのは、基本クラスを初期化するために特性メンバーを使用することです。

template<T>
class TraitUser:public X<typename Trait<T>::Type>
{
  //Trait<T> gets used in here
};

//class A;
//class A::B;   <-incomplete type used in nested name

//template<>
//struct Trait<A::B>
//{};

class A
{
private:
    //class B;

    //template<>         <-explicit specialization at class scope
    //struct Trait<B>
    //{};

    class B:TraitUser<B>
        {};
};


//template<>        <- specialization after instantiation
//struct Trait<A::B>
//{};

問題の根本は、ネストされたクラスを前方宣言できないことと、クラス宣言内で特殊化を定義できないことのようです。

C++ 11を使用してclangでこれを試しています。

4

1 に答える 1

3

ここには、いくつかの複雑な宣言の順序があります。

template <class T>
struct Trait;

template <class T>
struct X
{};

template<class T>
class TraitUser:public X<typename Trait<T>::Type>
{
  //Trait<T> gets used in here
};

class A
{
private:
    class B;
};


template<>
struct Trait<A::B>
{
    typedef int Type;
};

class A::B : public TraitUser<B>
{};
于 2013-08-05T18:50:57.363 に答える