命名空间内的类友元函数

Ale*_*Dan 11 c++ namespaces friend

我试图在命名空间之外定义一个类朋友函数,如下所示:

namespace A{
class window{
    private:
    int a;
    friend void f(window);
};
}

 void f(A::window rhs){
 cout << rhs.a << endl;
}
Run Code Online (Sandbox Code Playgroud)

我得到一个错误说有歧义.有两个候选人void A::f(A::window);void f(A::window).所以我的问题是:

1)如何使全局函数void f(A::window rhs)成为类A :: window的朋友.

编辑:(阅读答案后)

2)为什么我需要通过操作来限定窗口类中的成员函数f是全局的::f(window)

3)为什么我需要在这种特殊情况下预先声明函数f(A :: window),而当该类不是在命名空间中定义时,它是在函数被声明为朋友之后声明的函数的okey.

Fle*_*exo 20

除了添加::你需要转发声明它,例如:

namespace A { class window; }

void f(A::window);

namespace A{
  class window{
    private:
    int a;
    friend void ::f(window);
  };
}

void f(A::window rhs){
  std::cout << rhs.a << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

请注意,要使此前向声明起作用,您还需要转发声明该类!

  • @DavidFaure 有点晚了,但我也遇到了同样的问题。添加括号就可以了:`friend B (::f(window));`。(示例请参见 https://ideone.com/x38T88) (5认同)

seh*_*ehe 5

应该这样做:您需要前向声明以明确f在全局命名空间中(而不是静态文件中):

#include <string>
#include <iostream>

using namespace std;

////// forward declare magic:

namespace A{ class window; }    
void f(A::window rhs);

//////

namespace A {
    class window {
        private:
            int a;
            friend void ::f(window);
    };
}

void f(A::window rhs) {
    cout << rhs.a << endl;
}

int main()
{
}
Run Code Online (Sandbox Code Playgroud)