友谊和命名空间的问题

friendship and namespace issue

本文关键字:问题 命名空间 友谊      更新时间:2023-10-16

我在命名空间类和函数之间的友谊方面遇到了麻烦,如下所示:

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

感谢
namespace NS
{
    class Class
    {
    public:
        Class();
        virtual ~Class();
    private:
        void Foo();
        friend void Bar(Class&);
    };
}
void Bar(NS::Class& c)
{
    c.Foo();
}

通过使用范围操作符::

friend void ::Bar(Class&);

告诉编译器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();
}