23

当我这样声明一个朋友时,g ++编译器会抱怨这个错误:

friend MyClass;

代替

friend class MyClass;

为什么需要class关键字?(Borland C++ 编译器 BTW 不需要它。)

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

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

如果这对我来说很有意义(实际上会很棒)

friend class MyClass;

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

近 20 年来,我一直在愉快地使用没有classstruct关键字且没有编译器投诉的朋友语句。这是相当新的东西吗?

4

2 回答 2

23

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

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

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

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

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

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

于 2009-03-18T05:58:49.470 回答
22

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

friend <declaration>

其中<declaration>是类、结构、模板或函数的有效声明。

因此,

MyClass;

不是有效的声明,而:

class MyClass;

或者:

struct MyClass;

是。

同上,相应地:

friend class MyClass;

或者

friend struct MyClass;
于 2009-03-18T04:20:47.287 回答