5

这让我很惊讶。这有效:

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

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

4

1 回答 1

3

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

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

于 2013-07-25T19:48:45.973 回答