2012-04-06 104 views
2

我有嵌套模板及其模板专业化的问题。鉴于以下类:专用模板<typename T,模板<typename> class U>

小模板类

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 
+0

您似乎很困惑。 – 2012-04-06 18:48:23

+0

@ildjarn:不,这很好,因为'A'需要一个具有一个参数的模板类型。 “T”符合该法案。 – bitmask 2012-04-06 19:08:42

+0

@bitmask:啊,完全正确,我显然没有注意。 – ildjarn 2012-04-06 19:35:19

回答

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; 
}; 

and A会是:

template<typename T, template<typename> class U, template <typename> class E = Expander> class A { 
    typedef typename E<U<Your_Args_to_U> >::type; 
+0

但T代表一个模板,不是吗? – user988017 2012-04-06 19:22:21

+0

@ user988017:是的,但是'T *'没有。由于'T'不是一个类型(它是一个模板),你不能有一个指向它的指针。 C++ *可以*允许你使用这种非正式的符号,但它不会。 – bitmask 2012-04-06 19:23:39

+0

我明白了......解决这个问题的最简单方法是什么? – user988017 2012-04-06 19:27:32

相关问题