You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/array:126:29: note: template parameter has a different kind in template argument
template <class_Tp, size_t _Size>
^
main.cc:22:33: note: previous template template parameter is here
template <typename... Elem>
^
(完)
朋友们可以关注下我的公众号,获得最及时的更新:
The text was updated successfully, but these errors were encountered:
概念
一个模板的参数是模板类型。
举例
在c++11-17 模板核心知识(二)—— 类模板 中,如果我们想要允许指定存储Stack元素的容器,是这么做的:
使用:
但是这样的缺点是需要指定元素类型两次,然而这两个类型是一样的。
使用模板的模板参数(Template Template Parameters),允许我们在声明Stack类模板的时候只指定容器的类型而不去指定容器中
元素的类型。例如:
使用:
与第一种方式的区别是:第二个模板参数是一个类模板:
默认值从
std::deque<T>
改为了std::deque
.在C++17之后,模板的模板参数中的class也可以使用typename,但是不可以使用struct和union:
当然,由于模板的模板参数中的Elem没有用到,可以省略:
另外注意一点,模板的模板参数中的模板参数,只能和模板的模板参数配合用。有点饶,举个例子:
模板的模板参数的参数匹配 Template Template Argument Matching
大家可以尝试自己编译一下上面的代码,可能会出现下列问题:
意思是
std::deque
和Cont
不匹配。标准库的std::deque
有两个参数,还有一个默认参数Allocator :解决办法一
将Cont和std::deque的参数匹配即可:
这里的Alloc没有用到,同样可以省略。
成员函数定义举例:
解决办法二
利用c++11-17 模板核心知识(四)—— 可变参数模板 Variadic Template
但是,这点对于
std::array
无效,因为std::array的第二个参数是非类型模板参数 Nontype Template Parameters:假如使用
Stack<int,std::array> s;
,那么编译器会报错:(完)
朋友们可以关注下我的公众号,获得最及时的更新:
The text was updated successfully, but these errors were encountered: