Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++ 实例化模板类<;错误表达>;?_C++_Templates - Fatal编程技术网

C++ 实例化模板类<;错误表达>;?

C++ 实例化模板类<;错误表达>;?,c++,templates,C++,Templates,这是我的密码: template<typename T, template<typename = T,typename =std::allocator<typename = T> > class Container= std::vector> class stack { public: Container<T> cont; stack() { } }; 那么,有人能解释为什么我看到这些错误

这是我的密码:

template<typename T, template<typename = T,typename =std::allocator<typename = T> > class Container= std::vector>
 class stack
 {
     public:
     Container<T> cont;
     stack()
     {

     }
 };

那么,有人能解释为什么我看到这些错误,什么是错误的表达式吗?

在类模板的参数列表中,当您指定模板参数时,模板参数的模板参数没有被使用(实际上,它们不能被使用)。因此,你甚至可以不提他们的名字

所以你应该做的是:

template<typename T, template<class,class> class Container= std::vector>
class stack
{
     Container<T, std::allocator<T> > cont;
};
模板
类堆栈
{
集装箱运输;
};
也就是说,模板参数所需的只是参数的数量,以及它们的参数类型或值的信息

您还可以编写以下内容以提高可读性:

template<typename T, template<class U,class Allocator> class Container= std::vector>
class stack
{
     Container<T, std::allocator<T> > cont;
};
模板
类堆栈
{
集装箱运输;
};

至于为什么您的第一个代码不起作用,因为
std::allocator
应该是
std::allocator
。也就是说,这应该是可行的:

template<typename T, template<typename =T,typename =std::allocator<T> >  class Container= std::vector>
模板
请看这里:

但这样的模板参数的默认类型甚至并没有被考虑。他们被忽视了


现在您可能会问为什么
std::allocator
不工作。因为它的形状不好。你认为
std::vector
有意义吗?请注意
std::allocator
std::vector
都是类模板,但
Container
不是类模板。它是类模板的模板参数。这就是为什么,
typename=T
允许这样做,而类模板(如
std::allocator
)不允许这样做的原因。当模板参数本身是一个模板时,它自己的模板参数在外部模板的上下文中不被使用或相关,而只是定义“模板签名”模板参数的。因此,两个参数名称都不需要,因为它们不可用或不必要。你可以简单地说:

template <typename T, template<typename, typename> class Container = std::vector>
class stack
{
  typedef Container<T, std::allocator<T> > CT;
  // ...
};

[为了完整性:]将默认类型放在模板参数的参数列表中也会起作用,这意味着您以后可以忽略这些类型(就像您已经做的那样):


“错误的表达式”可能只是你的编译器被弄糊涂了。你仍然没有回答为什么我的代码(第一个代码块的第一行)不工作?你的意思是“然后模板模板参数的模板参数没有被使用(事实上,它们不能被使用)”?@Anubis先生:现在我解释了。您应该编写simpy
std::allocator
,而不是
std::allocator
。您总是告诉我哪一行有问题并删除错误。你没有一次告诉我为什么我不应该做这样的事情,为什么会发生这样的事情:(,看起来这里的很多观点都没有帮助:(@Anubis先生:我认为这已经足够了。但后来我意识到这对你来说还不够。。无论如何,我添加了一个解释。你仍然没有回答为什么我的代码(第一个代码块的第一行)不起作用?第二个嵌套的默认类型
typename=std::allocator
不起作用,因为那不是一个类型,而是一个模板。你应该说的是
typename=std::allocator
,因为那是一个类型。感谢Kerrek给出的漂亮解释性答案)BTW考虑编辑的答案,因为我的行是STD::ApLoalAtter No问题。不过,我只是修复了一个错误:您确实可以为模板参数的参数设置默认类型,正如您在代码中所做的那样。默认类型并不像我最初声称的那样无用。实际上,当您说“代码>容器< /代码>时,您依赖于DEF。在
容器中键入故障信息
template<typename T, template<typename =T,typename =std::allocator<T> >  class Container= std::vector>
template <typename T, template<typename, typename> class Container = std::vector>
class stack
{
  typedef Container<T, std::allocator<T> > CT;
  // ...
};
template <typename T, template<typename...> class Container = std::vector> class stack;
template<typename = T, typename = std::allocator<T> > class Container

---> now we can say:

Container<T> x;  // use second default argument
Container<> y;   // use both default arguments
 template <typename = T, typename = std::allocator<typename> > class Container
                                    ^^^^^^^^^^^^^^^^^^^^^^^^
                                            Error!!
template <typename = T, typename = std::allocator<T> > class Container
                                   ^^^^^^^^^^^^^^^^^
                                   OK, this is a type