В настоящее время я портирую проект, который до сих пор создавался только с использованием 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