2

ネストされたテンプレートとそのテンプレートの特殊化に問題があります。次のクラスがあるとします。

小さなテンプレート クラス

template<class U>
class T {
public:
    T(){}
    virtual ~T (){}

};

そして、ある種のネストされたテンプレート

template<typename T, template<typename> class U>
class A {
public:
    void foo() 
    { 
        std::cerr << "A generic foo"; 
    }
};

そして小さな main.cpp

int main(int argc, const char *argv[])
{
    A<int,T> *a = new A<int,T>;
    a->foo();

    //This wont work:
    A<double,T*> *b = new A<double,T*>;
    b->foo();

    return 0;
}

U がポインターの場合、特殊化が必要です。

    A<double,T*> *b = new A<double,T*>;
    b->foo();

これを達成する方法は?私は次のようなものを試しました:

template<typename T, template<typename> class U>
class A< T, U* >
{
public:
void foo()
{
    std::cerr << "A specialized foo";
}
};

しかし、それは単に解決します

A.h:18:16: Error: Templateargument 2 is invalid
4

1 に答える 1

0

意味がないので、あなたがしようとしていることは不可能ですT*。適切な型ではなく、追加のパラメーターを必要とするテンプレートとも一致しません。Uを表すとしたらT*、何にU<int>なりますか? おそらく意味T<int>*がありますが、それは宣言と一致しないため、その型を にプラグインする方法はありませんA

あなたがこれを回避する方法を求めたので、私の頭の上から、このようなものです。

への 3 番目のテンプレート引数を受け入れますA。これを呼び出しExpanderて、デフォルトで次のように設定します。

template <typename T> struct Expander {
  typedef T type;
};

次に、呼び出すときに次のようにA言うことができます

A<int,T> normal;
A<int,T,PtrExpander> pointer;

template <typename T> struct PtrExpander {
  typedef T* type;
};

そして次のAようになります:

template<typename T, template<typename> class U, template <typename> class E = Expander> class A {
  typedef typename E<U<Your_Args_to_U> >::type;
于 2012-04-06T19:06:50.857 に答える