Сфера функции друга в GCC - PullRequest
2 голосов
/ 06 ноября 2010

Согласно стандарту:

Функция-друг, определенная в классе, находится в (лексической) области действия класса, в котором она определена.

Тогда почему, черт возьми, это не работает (проверено несколько версий GCC)?

#include <iostream>
using namespace std;

class A
{
  friend void function() { cout << "text" << endl; };
};

// void function();

int main()
{
  function();
  return 0;
}

Раскомментирование объявления, конечно, решает проблему.

Редактировать (вывод gcc):

(xterm) $ g++ -ansi -pedantic -Wall -Wextra test.cpp 
test.cpp: In function ‘int main()’:
test.cpp:13:11: error: ‘function’ was not declared in this scope

1 Ответ

3 голосов
/ 06 ноября 2010

Цитата означает, что работает следующее: код находится в лексической области видимости класса, так что поиск по неквалифицированному имени будет вести себя особенно

class A
{
  typedef int type;

  friend void function() { 
    type foo; /* type is visible */ 
  };
};

Если бы вы определили «функцию» в области пространства имен, то «тип» не был бы виден - вы должны будете сказать «A :: тип». Вот почему в следующем предложении говорится: «Функция друга, определенная вне класса, не является». Неквалифицированный поиск имени для определения в классе обозначается как

Поиск имени для имени, используемого в определении функции друга (11.4), определенной в классе в строке Предоставление дружбы происходит, как описано для поиска в определениях функций-членов. Если друг функция не определена в классе, предоставляющем дружбу, поиск имени в определении функции друга должен действовать, как описано для поиска в определениях функций-членов пространства имен.

Так что текст, который вы цитировали, не обязательно должен быть нормативным - спецификация безусловного поиска по имени уже охватывает его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...