声明朋友时必须声明一个类键

Rog*_*son 23 c++ friend

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

friend MyClass;
Run Code Online (Sandbox Code Playgroud)

代替

friend class MyClass;
Run Code Online (Sandbox Code Playgroud)

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

难道编译器不能简单地在符号表中查找MyClass并告诉它被声明为一个类吗?(显然它正在进行查找,因为它在没有声明MyClass时会抱怨)

它不像是在进行类的前向声明:我仍然必须要么声明上面的类,要么至少要向前声明它.

这对我来说是有道理的(实际上会很棒)

friend class MyClass;
Run Code Online (Sandbox Code Playgroud)

如果需要,我会做出前瞻性声明,否则它对我来说就像是语法上的盐.

我已经愉快地使用没有classstruct关键字的friend语句,近20年没有编译器投诉.这是一个相当新的东西吗?

vla*_*adr 22

至于您的问题,因为它是ISO/IEC 14882:2003指定的方式 (第7.1.4节).该friend构造基本上指定为:

friend <declaration>
Run Code Online (Sandbox Code Playgroud)

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

从而,

MyClass;
Run Code Online (Sandbox Code Playgroud)

不是有效的声明,而是:

class MyClass;
Run Code Online (Sandbox Code Playgroud)

要么:

struct MyClass;
Run Code Online (Sandbox Code Playgroud)

是.

同意,相应地:

friend class MyClass;
Run Code Online (Sandbox Code Playgroud)

要么

friend struct MyClass;
Run Code Online (Sandbox Code Playgroud)


Mic*_*urr 22

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

精细类型说明符应在类的朋友声明中使用.

然后为了确保没有误解,它注意到:

需要详细类型说明符的类键.

GCC是我唯一抱怨缺少类密钥的编译器,但看起来其他编译器让我们逃避了非标准的东西......

至于理由 - 你必须问一个比我更了解编译器(或标准)的人.

  • 没有class-key的`friend`在g ++ 4.7.0/4.7.3下使用选项`-std = c ++ 11` (2认同)