【问题标题】:Why can't I befriend a template parameter?为什么我不能成为模板参数的朋友?
【发布时间】:2009-06-17 13:32:56
【问题描述】:

在研究问题的答案时(基于this answer),我尝试执行以下操作:

template <class T>
class friendly {
    friend class T;
};

friendly<string> howdy;

编译失败,出现以下错误:

错误:模板参数“T”不能用于 详细类型说明符 朋友班T;

据我的好朋友 Google 了解,这样我就不会意外地尝试实例化 friendly&lt;int&gt;,但为什么在编译模板时会出现错误?用无效类型实例化模板时不应该是错误吗(比如我写了int f() { return T::foo(); }

【问题讨论】:

标签: c++ templates friend


【解决方案1】:

该标准的第 7.1.5.3 节明确将此描述为一个不正确的详细类型说明符的示例。

可以在here找到有关该主题的讨论。

【讨论】:

  • +1,很好的发现。我记得有一次反对这个。我不知道为什么它被禁止——也许它给编译器实现者带来了困难?
  • 不要质疑圣经,儿子。
  • 我查看了引用的线程,除了指出它是非法的之外,没有任何关于原因的见解(这就是我在这个问题中所追求的)。
  • 你是对的。我也不知道是什么原理。但这适用于委员会设计的语言中的很多事情。
【解决方案2】:

更多 googleling 提出扩展 friend 声明 (PDF)C++0x

本文档包含以下内容:

template <typename T> class R {
    friend T;
};
R<C> rc; // class C is a friend of R<C>
R<int> ri; // OK: “friend int;” is ignored

这比我想象的更进一步(忽略非法的friend 减速而不是在实例化期间失败)。所以我想答案是没有充分的理由,并且正在纠正中。

【讨论】:

    猜你喜欢
    • 2017-08-08
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 2019-12-21
    • 2021-06-04
    相关资源
    最近更新 更多