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.

既然你从我的脑海中要求一种方法来解决这个问题,就像这样。

接受第三个模板参数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 回答