【问题标题】:Why can't the template parameter lists of a template and its template member be combined?为什么模板的模板参数列表不能与其模板成员合并?
【发布时间】:2018-09-03 03:17:15
【问题描述】:

我正在阅读“Stroustrup 的 C++ 编程语言”,其中提到它

请注意,模板的模板参数列表及其模板成员不能合并。

示例如下。

template<class T>
  template<class T2> Ptr<T>::operator Ptr<T2> () { return Ptr<T2>(p); }

template<class T, class T2> // error
  Ptr<T>::operator Ptr<T2> () { return Ptr<T2>(p); }

我不明白为什么不允许这样做,有人可以解释为什么不允许吗?

【问题讨论】:

  • 您在寻找语言规范吗?或可能存在问题的示例?
  • 例子会有帮助

标签: c++ templates


【解决方案1】:

因为这是两个不同的模板(一个模板化的类和该类的一个模板化成员函数),而起草规范的人决定有必要在函数定义中保持其可见性。

我认为这完全合乎逻辑。如果按照您建议的方式完成,阅读您的代码的程序员可能会认为只有一个带有两个参数的模板类,他就错了。

【讨论】:

  • 那么,第二个模板仅被解释为具有两个参数的类的成员函数,而不是具有一个参数的类的模板成员?
  • 不,看起来您有一个模板类 Ptr&lt;T&gt; 和该类的模板成员函数 - 转换运算符 operator Ptr&lt;T2&gt; ()。这两个模板中的每一个都有一个参数。
  • 所以,即使我能够识别出第二个是类模板的模板成员,也不允许合并,因为有人可能读错了
  • 是的,我认为这就是规范中有该要求的原因。请注意 - 在您自己忘记代码之后,有人可能就是您。
  • 好的,谢谢,我现在可以接受这个答案,但根据我之前问题的经验,我想我会等一段时间(可能一天),以防有其他问题答案。我希望没问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
  • 2018-12-16
  • 2011-10-01
  • 2010-12-13
  • 1970-01-01
  • 2015-09-04
  • 2021-09-11
相关资源
最近更新 更多