При закрытом доступе к перечислению не удается скомпилировать функцию друга вложенного класса - PullRequest
2 голосов
/ 31 мая 2019

В настоящее время я портирую проект, который до сих пор создавался только с использованием 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. Удаление этого делает код компиляции нормально с GCC, мне интересно, какой компилятор правильный? У меня сложилось впечатление, что функции-друзья имеют такой же доступ, что и функции-члены, что делает эту ошибку GCC.

Годболт ссылка: https://godbolt.org/z/OAR0gc

1 Ответ

0 голосов
/ 31 мая 2019
friend class Outer;

1.Не требуется, у вложенного класса есть доступ к закрытым членам охватывающего класса.

friend void somefunc()

2.Согласно https://en.cppreference.com/w/cpp/language/friend пункт 2, функция, что член "Внутренний" и друг не может получить привилегию из пункта 1. Удалить ключевое слово друга.

...