我想为我的班级重载operator<<
。我应该将此重载定义添加到std
命名空间吗? (因为ostream operator<<
是std
命名空间的一部分)或者我应该将它留在全局命名空间中吗?
简而言之:
class MyClass {
};
namespace std {
ostream& operator<< ( ostream& Ostr, const MyClass& MyType ) {}
}
或
class MyClass {
};
std::ostream& operator<< ( std::ostream& Ostr, const MyClass& MyType ) {}
哪个更合适,为什么?提前感谢您的回复。
答案 0 :(得分:28)
您应该将运算符重载放在与您的类相同的命名空间中。
这将允许在使用依赖于参数的查找的重载解析期间找到运算符(实际上,因为ostream
位于命名空间std
中,如果你把它放在重载超载中也会找到它在命名空间std
中,但没有理由这样做。)
从良好的设计实践的角度来看,运算符重载比类ostream
的接口更像是类接口的一部分,因此它与您的类属于同一个命名空间(另请参阅Herb Sutter的{ {3}})。
从编写符合标准且可移植的代码的角度来看,您不能将运算符重载放入名称空间std
。虽然您可以将用户定义实体的模板特化添加到命名空间std
,但您无法添加其他函数重载。
答案 1 :(得分:7)
不要将其添加到std
命名空间,将其放在与您的类相同的命名空间中。命名空间的目的是防止冲突。标准说
17.4.3.1保留名称
对于C ++程序来说,它是未定义的 添加声明或定义 命名空间std或命名空间 命名空间std除非另有说明 指定。程序可以添加模板 任何标准的专业化 库模板到命名空间std。 这样的专业化(完整或 部分)标准库 模板导致未定义的行为 除非声明取决于a 用户定义的外部链接名称 除非专业化会议 标准库要求 原始模板。
答案 2 :(得分:6)
不要添加到标准命名空间。 原因:如果每个人都这样做,标准命名空间就会有大量的名称冲突,这会破坏命名空间的目的。
你的目标是让你的班级“ostream-able”。它不需要在标准命名空间中执行此操作。只要你的班级被宣布为任何名称,你就没事了。将它放在标准命名空间中将是不好的做法。