我目前正在移植一个到目前为止只使用Clang构建的项目,以便与GCC一起工作。该项目包含类似于下面的代码,并且编译得很好,但是GCC给出了一条错误消息。
class Outer
{
enum
{
ONE, TWO, THREE, COUNT
};
public:
class Inner
{
friend class Outer;
friend void somefunc()
{
int x = Outer::COUNT;
}
};
};
错误是:
<source>: In function 'void somefunc()':
<source>:15:32: error: 'Outer::<unnamed enum> Outer::COUNT' is private within this context
15 | int x = Outer::COUNT;
| ^~~~~
<source>:6:26: note: declared private here
6 | ONE, TWO, THREE, COUNT
| ^~~~~
请注意某物的
签名中的朋友关键字。删除这使得代码编译与GCC罚款,我想知道哪个编译器是正确的?我的印象是朋友函数具有与成员函数相同的访问权限,这将使这成为GCC错误。
戈德博尔特链接:https://godbolt.org/z/OAR0gc
friend class Outer;
1.不需要,嵌套类可以访问拥抱类的私有成员。
friend void somefunc()
2.根据https://en.cppreference.com/w/cpp/language/friend第2点,“内部”成员和朋友不能从第1点获得特权的功能。删除好友关键字。