【问题标题】:Why the template with default template arguments can't be used as template with less template argument in Template Template Parameters为什么具有默认模板参数的模板不能用作模板模板参数中具有较少模板参数的模板
【发布时间】:2011-10-01 09:21:19
【问题描述】:

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;
}

【问题讨论】:

  • 你应该得到一个“最常使用'模板'这个词的问题”的徽章:)

标签: c++ templates stl


【解决方案1】:

来自标准(参见 14.3.3 第 1 段 - [temp.arg.template):

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

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

【讨论】:

  • 是的,这就是我期望的答案。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 2016-11-09
  • 1970-01-01
  • 2017-04-15
  • 2018-06-25
相关资源
最近更新 更多