如何在另一个C++命名空间中的全局命名空间中定义朋友?

And*_*eas 13 c++ scope namespaces friend

我想在全局命名空间中定义二元运算符.运算符处理在另一个名称空间中定义的类,并且运算符应该可以访问该类的私有成员.我遇到的问题是,当我在类定义中将它作为朋友时,我不知道如何扩展该全局运算符的范围.

我尝试过类似的东西:

namespace NAME
{
    class A {
        public:
            friend A ::operator * (double lhs, const A& rhs);
        private:
            int private_var;
    };
}

A operator * (double lhs, const A& rhs)
{
    double x = rhs.private_var;
    ...
}
Run Code Online (Sandbox Code Playgroud)

编译器(g ++ 4.4)不知道如何处理它.看来就行了

friend A ::operator * ()
Run Code Online (Sandbox Code Playgroud)

被评估为(伪代码)

(A::operator)
Run Code Online (Sandbox Code Playgroud)

代替

(A) (::operator)
Run Code Online (Sandbox Code Playgroud)

如果我在运算符的声明中省略了::编译工作,但运算符在命名空间NAME中而不在全局命名空间中.

在这种情况下,如何限定全局命名空间?

Mar*_*n B 15

首先,请注意您的运算符声明缺少A的名称空间限定:

NAME::A operator * (double lhs, const NAME::A& rhs)
Run Code Online (Sandbox Code Playgroud)

然后决定性的把戏就是像这样在朋友声明中添加括号,就像你在"伪代码"中提出的那样

friend A (::operator *) (double lhs, const A& rhs);
Run Code Online (Sandbox Code Playgroud)

为了使它全部编译,你需要一些前向声明,到达这个:

namespace NAME
{
    class A;
}

NAME::A operator * (double lhs, const NAME::A& rhs);

namespace NAME
{
    class A {
        public:
            friend A (::operator *) (double lhs, const A& rhs);
        private:
            int private_var;
    };
}

NAME::A operator * (double lhs, const NAME::A& rhs)
{
    double x = rhs.private_var;
}
Run Code Online (Sandbox Code Playgroud)

但亚历山大是对的 - 您应该将运算符声明为与其参数相同的名称空间.


Ste*_*sop 5

这可以编译,我假设没有测试它也可以工作。注意括号的使用:

namespace NAME {class A; }
NAME::A operator * (double lhs, const NAME::A& rhs);

namespace NAME
{
    class A {
        public:
            friend A (::operator *) (double lhs, const A& rhs);
        private:
            int private_var;
    };
}

NAME::A operator * (double lhs, const NAME::A& rhs)
{
    double x = rhs.private_var;
    return rhs;
}

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

但是,正如亚历山大所提到的,您的问题并没有解释为什么运算符不在名称空间 NAME 中。无论哪种方式,它都可以称为1.0 * some_A_instance. 所以你可能给自己制造了不必要的麻烦。