模板参数中又是一个template
template<typename T,template <typename T> class Container> class XC { private: Container<T> c; };
Container是拿第一个模板参数T作为自己的参数。这种设计为了让用户传进去任意一种容器并指定容器中元素的类型。
正确用法,指定容器为list,元素类型为int
template<class T> using Lst = list<T,allocator<T>>; //alias c++2.0新特性 void test01() { XC<int, Lst> x; }
错误用法
XC<int, list> x; //错误
因为第二个参数“list”,(其实所有容器都有两个模板参数)一个指定元素类型,一个指定分配器,类似于
template<class T,class Alloc=allocator<T>> class list {...}
编译器无法推导出它的分配器。
在标准库中还有一种用法和模板模板参数很像,但他不是模板模板参数。
template<typename T,typename Containter=deque<T>> class stack { private: Containter c; };
stack<int> xx; stack<int, list<int>> xc;
之所以说他不是模板模板参数,是因为stack<int,list<int>> 第二个模板参数与int 已经绑死,已经不叫模板了。