我目前正在移植一个迄今为止仅使用Clang构建的项目,以便与GCC一起使用。该项目包含与下面类似的代码,并且可以使用Clang很好地进行编译,但是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
| ^~~~~
请注意somefunc
签名中的friend关键字。删除此代码可使代码在GCC中正常编译,我想知道哪个编译器正确?我的印象是,朋友功能与成员功能具有相同的访问权限,这将使其成为GCC错误。
Godbolt链接:https://godbolt.org/z/OAR0gc
答案 0 :(得分:-1)
friend class Outer;
1。不需要,嵌套类可以访问拥抱类的私有成员。
friend void somefunc()
2。根据{{3}}第2点,“内在”成员和朋友无法从第1点获得特权的功能。删除Friend关键字。