非会员运营商超载应该放在哪里?

时间:2010-09-02 03:26:17

标签: c++ namespaces operator-overloading

我想为我的班级重载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 ) {}

哪个更合适,为什么?提前感谢您的回复。

3 个答案:

答案 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”。它不需要在标准命名空间中执行此操作。只要你的班级被宣布为任何名称,你就没事了。将它放在标准命名空间中将是不好的做法。