转发声明和朋友功能

时间:2013-04-09 11:28:53

标签: c++ namespaces friend

在这里提出问题 如果我省略这样的命名空间:

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(窗口)的前向声明,但是

friend void ::f(window);

不:

error C2039: 'f' : is not a member of '`global namespace''

有人可以解释一下它的原因吗?如果我们仍然在全局命名空间中,为什么::这会产生差异......

感谢?

1 个答案:

答案 0 :(得分:1)

如果你没有在朋友声明中限定f,它的行为就像一个普通的声明,并在周围的命名空间中声明f(在你的情况下为全局)。

但是,如果您明确将其限定为::f,则它不再是f的声明,而只是一个想要引用已声明的f的朋友声明。但没有,因此错误。