C++ 中的命名空间和运算符重载
在特定名称空间中编写库时,为该名称空间中的类提供重载运算符通常很方便。 看来(至少对于 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&);
中从我的测试来看,它们似乎都工作正常。 这两个选项之间有什么实际区别吗? 这两种方法更好吗?
When authoring a library in a particular namespace, it's often convenient to provide overloaded operators for the classes in that namespace. It seems (at least with g++) that the overloaded operators can be implemented either in the library's namespace:
namespace Lib {
class A {
};
A operator+(const A&, const A&);
} // namespace Lib
or the global namespace
namespace Lib {
class A {
};
} // namespace Lib
Lib::A operator+(const Lib::A&, const Lib::A&);
From my testing, they both seem to work fine. Is there any practical difference between these two options? Is either approach better?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您应该在库命名空间中定义它们。
无论如何,编译器都会通过参数相关查找找到它们。
不需要污染全局命名空间。
You should define them in the library namespace.
The compiler will find them anyway through argument dependant lookup.
No need to pollute the global namespace.
由于 Koenig 查找,将其放入库命名空间是可行的。
Putting it into the library namespace works because of Koenig lookup.
您应该在命名空间中定义它,这既是因为语法不会那么冗长,又不会使全局命名空间变得混乱。
实际上,如果您在类定义中定义重载,这将成为一个没有实际意义的问题:
You should define it in the namespace, both because the syntax will be less verbose and not to clutter the global namespace.
Actually, if you define your overloads in your class definition, this becomes a moot question: