C++ 专门化模板<;类型名T、模板<;typename>;U类>;
我对嵌套模板及其模板专门化有问题。鉴于以下类别: 一个小的模板类C++ 专门化模板<;类型名T、模板<;typename>;U类>;,c++,templates,C++,Templates,我对嵌套模板及其模板专门化有问题。鉴于以下类别: 一个小的模板类 template<class U> class T { public: T(){} virtual ~T (){} }; 你想做的是不可能的,因为T*没有任何意义。它既不是正确的类型,也不匹配需要附加参数的模板。如果U代表T*,那么U将是什么?您的意思可能是T*,但这与您的声明不匹配,因此无法将该类型插入A 因为你想从我的头顶上找到一个绕过这一切的方法,就像这样 接受a的第三个模板参数,我将调用Ex
template<class U>
class T {
public:
T(){}
virtual ~T (){}
};
你想做的是不可能的,因为
T*
没有任何意义。它既不是正确的类型,也不匹配需要附加参数的模板。如果U
代表T*
,那么U
将是什么?您的意思可能是T*
,但这与您的声明不匹配,因此无法将该类型插入A
因为你想从我的头顶上找到一个绕过这一切的方法,就像这样
接受a
的第三个模板参数,我将调用Expander
,并将其默认设置为:
template <typename T> struct Expander {
typedef T type;
};
与
你想做的是不可能的,因为
T*
没有任何意义。它既不是正确的类型,也不匹配需要附加参数的模板。如果U
代表T*
,那么U
将是什么?您的意思可能是T*
,但这与您的声明不匹配,因此无法将该类型插入A
因为你想从我的头顶上找到一个绕过这一切的方法,就像这样
接受a
的第三个模板参数,我将调用Expander
,并将其默认设置为:
template <typename T> struct Expander {
typedef T type;
};
与
你似乎很困惑。@ildjarn:不,没关系,因为
A
需要一个带有一个参数的模板类型T
符合这个要求。@bitmask:啊,完全正确,我显然没有注意。你似乎有点困惑。@ildjarn:不,没关系,因为A
需要一个带有一个参数的模板类型T
符合要求。@bitmask:啊,完全正确,我显然没有注意。但T确实代表一个模板,不是吗?@user988017:是的,但T*
不代表。因为T
不是一个类型(它是一个模板),所以不能有指向它的指针。C++可以让你使用这种非正式的符号,但它不。我明白了。解决这个问题最简单的方法是什么?但是T确实代表一个模板,不是吗?@user988017:是的,但是T*
不代表。因为T
不是一个类型(它是一个模板),所以不能有指向它的指针。C++可以让你使用这种非正式的符号,但它不。我明白了。最简单的方法是什么?
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
template <typename T> struct Expander {
typedef T type;
};
A<int,T> normal;
A<int,T,PtrExpander> pointer;
template <typename T> struct PtrExpander {
typedef T* type;
};
template<typename T, template<typename> class U, template <typename> class E = Expander> class A {
typedef typename E<U<Your_Args_to_U> >::type;