38

在特定命名空间中编写库时,为该命名空间中的类提供重载运算符通常很方便。似乎(至少在 g++ 中)重载的运算符可以在库的命名空间中实现:

namespace Lib {
class A {
};

A operator+(const A&, const A&);
} // namespace Lib

或全局命名空间

namespace Lib {
class A {
};
} // namespace Lib

Lib::A operator+(const Lib::A&, const Lib::A&);

根据我的测试,它们似乎都运行良好。这两个选项之间有什么实际区别吗?哪种方法更好?

4

3 回答 3

38

您应该在库名称空间中定义它们。编译器无论如何都会通过参数相关查找找到它们。

无需污染全局命名空间。

于 2008-10-05T12:03:24.857 回答
16

由于Koenig lookup ,将其放入库命名空间是可行的。

于 2008-10-05T12:21:18.487 回答
2

您应该在命名空间中定义它,因为语法不会那么冗长,而且不会使全局命名空间混乱。

实际上,如果您在类定义中定义重载,这将成为一个没有实际意义的问题:

namespace Lib {

class A {
public:
    A operator+(const A&);
};

} // namespace Lib
于 2008-10-05T12:20:24.183 回答