私有枚举访问无法从嵌套类的friend函数进行编译

时间:2019-05-30 21:35:14

标签: c++ c++14 language-lawyer

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

1 个答案:

答案 0 :(得分:-1)

friend class Outer;

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

friend void somefunc()

2。根据{{​​3}}第2点,“内在”成员和朋友无法从第1点获得特权的功能。删除Friend关键字。