在特定命名空间中创建库时,为该命名空间中的类提供重载操作符通常很方便。似乎(至少用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&);

从我的测试来看,它们似乎都运行良好。这两个选项之间是否存在实际差异?这两种方法都更好吗?

有帮助吗?

解决方案

您应该在库名称空间中定义它们。 无论如何,编译器将通过参数依赖查找找到它们。

无需污染全局命名空间。

其他提示

将其放入库名称空间是因为 Koenig查找

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

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

namespace Lib {

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

} // namespace Lib
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top