【问题标题】:Forward declaration and friend function前向声明和友元函数
【发布时间】:2013-03-31 19:22:08
【问题描述】:

按照这里的问题 如果我像这样省略命名空间:

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''

有人能解释一下原因吗?如果我们无论如何都在全局命名空间中,为什么 :: 会产生这种差异......

谢谢?

【问题讨论】:

    标签: c++ namespaces friend


    【解决方案1】:

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

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

    【讨论】:

    • 比这复杂一点。不限定,friend 声明在最近的周围命名空间中声明函数,但它只是将名称引入到类中(当然,它会使用 ADN 找到)。
    • 我会接受@Angew 的回答,但我只是用gcc 测试了这段代码,这两种情况都无需前向声明即可编译...谁能解释为什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 2021-10-05
    • 2012-12-09
    • 1970-01-01
    相关资源
    最近更新 更多