【问题标题】:a class-key must be declared when declaring a friend声明朋友时必须声明类键
【发布时间】:2023-03-30 18:19:01
【问题描述】:

当我这样声明一个朋友时,g++ 编译器报错:

friend MyClass;

而不是

friend class MyClass;

为什么需要 class 关键字? (Borland C++ 编译器,顺便说一句,不需要它。)

编译器不能简单地在符号表中查找 MyClass 并告诉它被声明为一个类吗? (显然它无论如何都在进行查找,因为它在未声明 MyClass 时会抱怨)

这不像是对类进行前向声明:我仍然必须在上面声明类或至少前向声明它。

如果

对我来说很有意义(实际上会很棒)
friend class MyClass;

如果需要,进行前向声明,否则对我来说就像是语法盐。

近 20 年来,我一直在愉快地使用没有 class 或 struct 关键字的 friend 语句,并且没有任何编译器投诉。 这是相当新的东西吗?

【问题讨论】:

  • 20 年!您一定一直在与 Bjorn 合作。
  • 我在 1989 年左右读研究生时使用 C-Front。从 1991 年左右开始,我主要使用 Borland C++。

标签: c++ friend


【解决方案1】:

就您的问题而言,因为这是 ISO/IEC 14882:2003 指定的方式(第 7.1.4 节)。 friend 构造基本上指定为:

friend <declaration>

其中&lt;declaration&gt; 是类、结构、模板或函数的有效声明。

因此,

MyClass;

不是一个有效的声明,而:

class MyClass;

或:

struct MyClass;

是。

同上,相应地:

friend class MyClass;

或

friend struct MyClass;

【讨论】:

  • 谢谢你们,你们今天救了我的培根。
  • 如果MyClass是类模板,friend声明也需要template
【解决方案2】:

我对此感到惊讶(因此删除了之前的错误答案)。 C++03 标准在 11.4 中说:

在类的友元声明中应使用详细类型说明符。

然后为了确保没有误解,它的脚注是:

详细类型说明符的类键是必需的。

GCC 是我拥有的唯一一个抱怨缺少类键的编译器,但看起来其他编译器让我们摆脱了一些非标准...

现在至于基本原理 - 您必须询问比我更了解编译器(或标准)的人。

【讨论】:

  • friend 没有 class-key 在 g++ 4.7.0/4.7.3 下使用选项 -std=c++11
  • 如果你也根据 C++11 更新你的答案会更好,C++11 已经引入了 extendedfriend declarations 。见ibm.com/developerworks/community/blogs/…
猜你喜欢
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多