友谊和名称空间问题

时间:2015-06-08 07:11:12

标签: c++ namespaces

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

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

由于

public interface A {}

public class B implements A {}

public static void main(String[] args)
{
    A test1 = new B();
    B test2 = new B();  
}

1 个答案:

答案 0 :(得分:5)

使用范围运算符::

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();
}