【问题标题】:c++ inline friend function with same name as member variablec ++内联友元函数与成员变量同名
【发布时间】:2013-07-25 21:26:01
【问题描述】:

这让我很惊讶。这有效:

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
};

为什么这两个(禁止)都不允许?

【问题讨论】:

  • return ::x(f); 有效吗?那应该明确引用全局命名空间中的x()。 (如果x() 不在全局命名空间中,请尝试::the::namespace::x(f)。)
  • @cdhowie: "朋友的名字未找到通过非限定查找或通过限定查找直到在该命名空间中提供匹配声明范围”。依赖于参数的查找是找到它的唯一方法,或者在类上方添加声明(因为在类下方对于 friend int y() 的内联声明来说太迟了,无法找到它)
  • 什么样的命名约定会导致成员变量和友元函数共享名字?这才是你真正需要解决的问题。

标签: c++ inline member friend friend-function


【解决方案1】:

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

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

【讨论】:

  • 根据stackoverflow.com/a/8284809/103167,不可以叫::x(f)
  • Ben 是正确的,除非您还在命名空间级别提供声明,否则您只能通过 ADL 访问友元函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多