如果我有一些为库本地对象定义的重载ostream运算符,那么它们可以转到std命名空间吗?如果我没有在std命名空间中声明它们,那么我必须使用using ns:: operator <<
。
作为一个可能的后续问题,是否有任何运营商应该转到标准或全局命名空间?
答案 0 :(得分:24)
根据Koenig Lookup(C ++标准3.4.2),将在参数的名称空间中搜索operator<<
。无需在std
命名空间中声明它。
答案 1 :(得分:21)
operator<<( ..., MyClass )
应与MyClass
位于同一名称空间中。您应该将其视为MyClass
接口的一部分,即使它恰好是(必然)非成员函数。
一些参考文献:
答案 2 :(得分:7)
C ++标准明确禁止您在std命名空间中声明自己的构造。
答案 3 :(得分:2)
将任何东西(类型,运算符等)声明为您不拥有的命名空间的一部分通常是一种不好的做法。这会对使用您图书馆的人产生意想不到的后果。更好的解决方案是定义自己的命名空间,并在需要组合解决方案时导入std
和命名空间。