【问题标题】:Scope of friend function in GCCGCC中友元函数的范围
【发布时间】:2010-11-06 17:05:43
【问题描述】:

按照标准:

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

那为什么这不起作用(测试了多个 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

【问题讨论】:

  • 你能发布你得到的错误吗?

标签: c++ gcc


【解决方案1】:

引号表示以下工作 - 代码在类的词法范围内,因此非限定名称查找将表现特殊

class A
{
  typedef int type;

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

如果您在命名空间范围内定义了“function”,那么“type”将不可见 - 您必须说“A::type”。这就是为什么它在下一句中说“在类外定义的友元函数不是。”。类内定义的非限定名称查找表示为

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

因此,您引用的文本并不一定是规范性的 - 非限定名称查找规范已经涵盖了它。

【讨论】:

  • 哦,你是对的,我看错了,但是 11.4.5 仍然说它应该有命名空间范围。
  • @Let_Me_be 更准确地说,11.4/5 中的文本应该说函数是命名空间成员。函数和对象不能真正具有范围。只有他们的名字可以有。该标准对术语“范围”和“名称”的规定非常宽松,因此在许多地方,只有使用上下文才能说明其含义。
  • 例如,当它说一个特定的函数有一个作用域时,它通常意味着它是某个命名空间的成员(参见 3.4.2/1 的类似用法和命名空间范围的友元函数可能会发现不可见的声明 (11.4)。”)。更糟糕的是,“声明”可能意味着两个功能:一是引入名称,二是实际的句法结构。只有上下文才能说明所谈论的内容。
  • @litb “命名空间范围”是一个成熟的技术术语,在 C++ 中它的意思是“文件范围”。
  • 有关清理“范围”使用的尝试,请参阅open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#554。不过,IMO 需要做很多工作才能再次明确这一点。
猜你喜欢
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
相关资源
最近更新 更多