友谊和名称空间问题

Dam*_*ien 2 c++ namespaces

我遇到了一个命名空间类和一个函数之间的友谊问题,如下所示:

如何判断友元函数是否在命名空间之外?

谢谢

namespace NS
{
    class Class
    {
    public:
        Class();
        virtual ~Class();

    private:
        void Foo();

        friend void Bar(Class&);
    };
}

void Bar(NS::Class& c)
{
    c.Foo();
}
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 5

通过使用范围运算符 ::

friend void ::Bar(Class&);
Run Code Online (Sandbox Code Playgroud)

这告诉编译器Bar在全局范围内.


显然,在使用范围运算符时,Bar函数需要在声明中使用之前friend声明.问题是Bar要声明你需要声明命名空间NS和类NS::Class.

像这样的东西

namespace NS
{
    class Class;
}

extern "C"
{
    void Bar(NS::Class& c);
}

namespace NS
{
    class Class
    {
    public:
        Class();
        virtual ~Class();

    private:
        void Foo() {}

        friend void ::Bar(Class&);
    };
}

void Bar(NS::Class& c)
{
    c.Foo();
}
Run Code Online (Sandbox Code Playgroud)