当我声明一个朋友时,g ++编译器会抱怨这个错误:
friend MyClass;
而不是
friend class MyClass;
为什么要求 class 关键字? (Borland C ++编译器,BTW,不需要它。)
编译器是否只能在符号表中查找MyClass并告诉它被声明为一个类? (显然它正在进行查找,因为它在没有声明MyClass时会抱怨)
它不是正在进行类的前向声明:我仍然必须声明上面的类或者至少已经向前声明了它。
如果
,那对我来说是有意义的(实际上会很棒)friend class MyClass;
如果需要,进行前瞻声明,否则它对我来说似乎是句法上的盐。
我一直愉快地使用没有类或 struct 关键字的朋友语句,近20年没有编译器投诉。 这是一个相当新的东西吗?
答案 0 :(得分:22)
至于您的问题,因为它是ISO / IEC 14882:2003指定的方式(第7.1.4节)。 friend
构造基本上指定为:
friend <declaration>
其中<declaration>
是类,结构,模板或函数的有效声明。
因此,
MyClass;
不是有效声明,而是:
class MyClass;
或:
struct MyClass;
是
同意,相应地:
friend class MyClass;
或
friend struct MyClass;
答案 1 :(得分:22)
我对此感到惊讶(结果删除了之前的错误答案)。 C ++ 03标准在11.4中说:
详细类型说明符应在类的朋友声明中使用。
然后为了确保没有误解,它注意到:
需要详细说明类型说明符的类键。
GCC是我唯一抱怨缺少类密钥的编译器,但看起来其他编译器让我们放弃了非标准的东西......
现在至于理由 - 你必须问一个比我更了解编译器(或标准)的人。