C++ c++;与成员变量同名的内联友元函数

C++ c++;与成员变量同名的内联友元函数,c++,inline,member,friend,friend-function,C++,Inline,Member,Friend,Friend Function,这让我很惊讶。这项工作: struct foo { int x; friend int x(foo f) { return f.x; } friend int y(foo f); }; int y(foo f) { return x(f); } // no problem 但这是一个错误: struct foo { int x; friend int x(foo f) { return f.x; } friend int y(foo f) { return x(f);

这让我很惊讶。这项工作:

struct foo {
  int x;
  friend int x(foo f) { return f.x; }
  friend int y(foo f);
};

int y(foo f) { return x(f); } // no problem
但这是一个错误:

struct foo {
  int x;
  friend int x(foo f) { return f.x; }
  friend int y(foo f) { return x(f); } // error: invalid use of foo::x data member
};

为什么这两个(dis)都不被允许?

原因是在第一种情况下,友谊将函数声明注入到封闭的命名空间中,因此对
x
的全局作用域调用只能看到一个
x


在第二个示例中,
x
在该范围内有两种含义:全局友元函数和变量(可能会隐藏全局友元函数)。

没有
return::x(f)工作?它应该显式引用全局命名空间中的
x()
。(如果
x()
不在全局命名空间中,请尝试
::the::namespace::x(f)
)@cdhowie:“在该命名空间范围中提供匹配声明之前,通过非限定查找或限定查找不会找到朋友的姓名”。依赖于参数的查找是找到它或在类上方添加声明的唯一方法(因为在类下方进行
friend int y()
的内联声明已经太迟了),什么样的命名约定会导致成员变量和friend函数共享一个名称?这是您真正需要解决的问题。根据,不,您不能将其称为
::x(f)
。Ben是正确的,除非您也在命名空间级别提供声明,否则您只能通过ADL访问friend函数。