为什么具有默认模板参数的模板不能用作模板参数中模板参数较少的模板

时间:2011-07-08 15:30:37

标签: c++ templates stl

myTemplateTemplate期望第二个模板参数是带有一个参数的模板。 myDefaultTemplate是一个带有两个参数的模板,第二个参数的默认类型为int。

在VS2008中,我收到编译错误:类模板'myDefaultTemplate'的模板参数列表与模板参数'TT'的模板参数列表不匹配

那么,为什么myDefaultTemplate不能仅用作一个参数的模板呢? 如果C ++编译器支持它会有任何负面影响吗?

template
<typename T1, typename T2 = int>
class
myDefaultTemplate{
      T1 a;
      T2 b;
};

template
<typename T1, template<typename T2> class TT>
class
myTemplateTemplate{
      T1 a;
      TT<T1> b;
};

int main(int argc, char* argv[]){
      myTemplateTemplate<int, myDefaultTemplate> bar; //error here:      
      return 0;
}

1 个答案:

答案 0 :(得分:7)

从标准(见14.3.3第1段 - [temp.arg.template]:

  

模板模板参数的模板参数应为   类模板的名称,表示为id-expression。只有初级   匹配模板模板时会考虑类模板   参数与相应的参数;部分专业是   即使他们的参数列表与参数列表相匹配也不予考虑   模板模板参数。

这意味着模板myDefaultTemplate将仅被视为2个参数模板。不会考虑默认参数。