Это удивило меня. Это работает:
struct foo {
int x;
friend int x(foo f) { return f.x; }
friend int y(foo f);
};
int y(foo f) { return x(f); } // no problem
Но это ошибка:
struct foo {
int x;
friend int x(foo f) { return f.x; }
friend int y(foo f) { return x(f); } // error: invalid use of foo::x data member
};
Почему не разрешены оба этих варианта?
Причина в том, что в первом случае дружба внедрила объявление функции во вложенное пространство имен, поэтому глобальный вызов x
можно увидеть только один x
,
Во втором примере x
имеет два значения в этой области: глобальная функция друга и переменная (которая, вероятно, скрывает глобальную функцию друга).
Других решений пока нет …