前向声明和友元功能

Forward declaration and friend function

本文关键字:友元 功能 声明      更新时间:2023-10-16

下面的问题如果我像这样省略命名空间:

void f(window);
  class window{
    private:
    int a;
    friend void ::f(window);
  };
void f(window rhs){
  std::cout << rhs.a << std::endl;
}

我得到奇怪的行为:

friend void f(window);

编译时不需要前向声明f(window),但是

friend void ::f(window);

不:

error C2039: 'f' : is not a member of '`global namespace''
有人能解释一下原因吗?为什么::有这样的区别,如果我们在全局命名空间…

谢谢?

如果在友元声明中没有限定f,它的行为也像普通声明一样,并在周围的名称空间中声明f(在您的情况下是全局的)。

然而,如果您显式地将其限定为::f,则它不再是f的声明,而只是想引用已经声明的f的友元声明。但是没有,因此出现错误。