不同命名空间中的友元运算符

Friend operator in different namespace

本文关键字:友元 运算符 命名空间      更新时间:2023-10-16

当前以下代码不起作用:

namespace inner
{
    struct Test
    {
        Test() : n(0) { }
        friend int ::operator+(const Test& a, const Test& b);
    private:
        int n;
    };
}
int operator+(const inner::Test& a, const inner::Test& b)
{
    return a.n + b.n;
}

我得到的错误是

error: 'int operator+(const inner::Test&, const inner::Test&)' should have been declared inside '::'
         friend int ::operator+(const Test& a, const Test& b);
                                                            ^

我原以为对名称空间进行限定可以解决问题,但事实并非如此。什么是变通方法?

友元声明只能将名称引入到紧邻的命名空间中。

如果你想与任何其他命名空间中的函数成为朋友,那么你需要在朋友声明之前,在其命名空间中声明该函数。正如错误消息所说。

在这种情况下,您可能希望运算符位于inner中,而不是全局命名空间中。依赖于参数的查找仍然会在像test_a + test_b这样的表达式中找到它,即使它不在作用域中。

在结构中使用运算符之前,必须声明运算符。