当我声明一个朋友时,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)
如果需要,我会做出前瞻性声明,否则它对我来说就像是语法上的盐.
我已经愉快地使用没有class或struct关键字的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是我唯一抱怨缺少类密钥的编译器,但看起来其他编译器让我们逃避了非标准的东西......
至于理由 - 你必须问一个比我更了解编译器(或标准)的人.
| 归档时间: |
|
| 查看次数: |
14023 次 |
| 最近记录: |