提问者:小点点

私有枚举访问无法从嵌套类的朋友函数编译


我目前正在移植一个到目前为止只使用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


共1个答案

匿名用户

friend class Outer;

1.不需要,嵌套类可以访问拥抱类的私有成员。

friend void somefunc()

2.根据https://en.cppreference.com/w/cpp/language/friend第2点,“内部”成员和朋友不能从第1点获得特权的功能。删除好友关键字。