根据标准:
在类中定义的友元函数位于定义它的类的(词法)范围内。
那么为什么这样做不起作用(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
答案 0 :(得分:3)
引用意味着以下工作 - 代码在类的词法范围内,这样非限定名称查找将特别表现
class A
{
typedef int type;
friend void function() {
type foo; /* type is visible */
};
};
如果在命名空间作用域中定义了“function”,则“type”将不可见 - 您必须说“A :: type”。这就是为什么它在下一句话中说“在课堂外定义的朋友功能不是。”。对于类内定义的非限定名称查找表示为
在类中内联定义的友元函数(11.4)的定义中使用的名称的名称查找 授予友谊应按照成员函数定义中的查找进行。如果是朋友 函数未在类中授予友谊,在友元函数定义中查找名称 应按照命名空间成员函数定义中的描述进行操作。
因此,您引用的文本实际上并不需要是规范性的 - 不合格的名称查找规范已经涵盖了它。