После вопроса здесь если опустить пространство имен, как это:Переслать объявление и друг функции
void f(window);
class window{
private:
int a;
friend void ::f(window);
};
void f(window rhs){
std::cout << rhs.a << std::endl;
}
я получаю странное поведение:
friend void f(window);
компилировать без прямой декларации F (окна), но
friend void ::f(window);
не делает:
error C2039: 'f' : is not a member of '`global namespace''
Может кто-нибудь объяснить причину этого? Почему: делает это различие, если мы все еще находимся в глобальном пространстве имен ...
Спасибо?
Это немного сложнее, чем это. Unqualited, декларация друга объявляет функцию в ближайшем окружающем пространстве имен, но она вводит только имя в класс (но, разумеется, оно будет найдено с использованием ADN). –
Я бы принял ответ @ Angew, но я только что проверил этот код с gcc и там оба случая скомпилированы без форвардной декларации ... Может ли кто-нибудь объяснить, почему? –