У меня есть следующий код:
struct M {
friend void f() {}
M() {
f(); // error: 'f' was not declared in this scope
}
};
int main() {
M m;
}
Оба g++ 4.8 и clang3.4 не могут скомпилировать его, потому что f
не отображается внутри M
, или, соответственно, они говорят.
Однако стандарт дает пример аналогичного кода
class M {
friend void f() { } // definition of global f, a friend of M,
// not the definition of a member function
};
и говорит, что
Функция A
friend
, определенная в классе, находится в (лексическом) объеме класс, в котором он определен.
(ISO/IEC 14882: 2011 11.3 Друзья [class.friend] p6, p7)
Из этого я не могу понять, как компилятор не может найти f
, который определен в том же классе, где он использовался.
Как маловероятно, что оба компилятора имеют одинаковую ошибку.
Итак, что я пропустил?