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

时间:2009-03-18 04:18:04

标签: c++ friend

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

friend MyClass;

而不是

friend class MyClass;

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

编译器是否只能在符号表中查找MyClass并告诉它被声明为一个类? (显然它正在进行查找,因为它在没有声明MyClass时会抱怨)

它不是正在进行类的前向声明:我仍然必须声明上面的类或者至少已经向前声明了它。

如果

,那对我来说是有意义的(实际上会很棒)
friend class MyClass;
如果需要,

进行前瞻声明,否则它对我来说似乎是句法上的盐。

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

2 个答案:

答案 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是我唯一抱怨缺少类密钥的编译器,但看起来其他编译器让我们放弃了非标准的东西......

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