Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 专门化模板<;类型名T、模板<;typename>;U类>;_C++_Templates - Fatal编程技术网

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;