2013-04-09 2 views
1

После вопроса здесь если опустить пространство имен, как это:Переслать объявление и друг функции

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'' 

Может кто-нибудь объяснить причину этого? Почему: делает это различие, если мы все еще находимся в глобальном пространстве имен ...

Спасибо?

ответ

1

Если вы не квалифицируете f в объявлении друга, он также ведет себя как нормальное объявление и объявляет f в окружающем пространстве имен (глобальном в вашем случае).

Однако, если вы явно квалифицируете его как ::f, это уже не объявление f, а только объявление друга, которое хочет ссылаться на уже объявленный f. Но их нет, следовательно, ошибка.

+1

Это немного сложнее, чем это. Unqualited, декларация друга объявляет функцию в ближайшем окружающем пространстве имен, но она вводит только имя в класс (но, разумеется, оно будет найдено с использованием ADN). –

+0

Я бы принял ответ @ Angew, но я только что проверил этот код с gcc и там оба случая скомпилированы без форвардной декларации ... Может ли кто-нибудь объяснить, почему? –

Смежные вопросы