模板的模板参数 模板的模板参数template template parameter是指C语言程序设计中一个模板的参数是模板类型只有类模板允许其模板参数是模板类型函数模板不允许具有这样的模板参数此处有争议 模板的模板参数可以有默认值例如 template class T  float struct B  template template class TT  float class T struct A  inline void f inline void g  template template class TT class T void ATf  T t  error  TT has no default template argument  template template class TT  char class T void ATg  T t  OK  Tchar  模板的模板参数其实参应当是类模板名字或者别名模板alias template当模板的模板参数做形参实参结合时仅考虑把实参的基本即未特化类模板与模板的模板形参做匹配不考虑实参的偏特化类模板即使偏特化后的参数列表与模板的模板形参匹配得上 例如 template typename T template typename ELEM typename ALLOC  stdallocatorELEM  class CONT  stddeque deque的基本型有个模板参数 class Stack  private CONTT elems  OK   当模板的模板参数被实例化时考虑采用该模板参数的偏特化版本如果在实例化之处该偏特化版本仍不可见且如果它是可见的则应该当采用这时该程序为病态 例如 templateclass T class A   primary template int x  templateclass T class AT   partial specialization long x  templatetemplateclass U class V class C  Vint y Vint z  CA c  Vint within CA uses the primary template so cyx has type int  Vint within CA uses the partial specialization so czx has type long 当一个模板的模板形参称作P与一个作为实参的模板称作A匹配时 要求P与A各自的模板形参列表的对应成员满足 具有相同种类类型参数非类型参数模板作为参数 如果二者是非类型的模板参数则其具体类型应相等 如果二者是模板作为参数则递归执行上述模板的模板参数形实匹配规则 如果P是一个可变参数模板即P的模板形参列表包含了模板参数包template parameter pack则这个模板参数包应该匹配A中个或者多个模板参数或者匹配A中的对应的模板参数包例如 templateclass T class A      templateclass T class U  T class B      template class  Types class C      templatetemplateclass class P class X      templatetemplateclass  class Q class Y      XA xa  OK XB xb  illformed default arguments for the parameters of a template argument are ignored XC xc  illformed a template parameter pack does not match a template parameter YA ya  OK YB yb  OK YC yc  OK template class T struct eval template template class class class TT class T class Rest struct evalTTT Rest   template class T struct A template class T class T struct B template int N struct C template class T int N struct D template class T class T int N   struct E evalAint eA  OK matches partial specialization of eval