模板参数中又是一个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 已经绑死,已经不叫模板了。