GCC中朋友功能的范围

时间:2010-11-06 17:05:44

标签: c++ gcc

根据标准:

  

在类中定义的友元函数位于定义它的类的(词法)范围内。

那么为什么这样做不起作用(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 个答案:

答案 0 :(得分:3)

引用意味着以下工作 - 代码在类的词法范围内,这样非限定名称查找将特别表现

class A
{
  typedef int type;

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

如果在命名空间作用域中定义了“function”,则“type”将不可见 - 您必须说“A :: type”。这就是为什么它在下一句话中说“在课堂外定义的朋友功能不是。”。对于类内定义的非限定名称查找表示为

  

在类中内联定义的友元函数(11.4)的定义中使用的名称的名称查找   授予友谊应按照成员函数定义中的查找进行。如果是朋友   函数未在类中授予友谊,在友元函数定义中查找名称   应按照命名空间成员函数定义中的描述进行操作。

因此,您引用的文本实际上并不需要是规范性的 - 不合格的名称查找规范已经涵盖了它。