应该在哪里非成员运算符重载放在哪里?应该在哪里非成员运算符重载放在哪里?(Where should

2019-05-12 07:27发布

我想重载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 ) {}

这是比较合适的,为什么? 在此先感谢您的答复。

Answer 1:

你应该把运算符重载在相同的命名空间类。

这将允许使用参数相关查找(当然,实际上,因为重载解析过程中发现的经营者ostream是在命名空间std ,过载超载也将如果你把它在命名空间中发现std ,但也没有理由这样做那)。

但从良好的设计实践来看,运算符重载更适合你的类的接口比的界面的一部分ostream ,因此它属于在相同的命名空间类(见香草萨特的命名空间和接口原理 )。

但从书面标准兼容和移植代码的时候,你不能把运算符重载到命名空间std 。 虽然可以为用户自定义实体添加模板专门到命名空间std ,你不能添加额外的功能超载。



Answer 2:

不要把它添加到std命名空间,将其放置在相同的命名空间类。 命名空间的目的是为了防止碰撞。 该标准说

17.4.3.1保留名称

它是未定义C ++程序添加声明或定义除非另有规定空间std内空间std或命名空间。 程序可以为任何标准库模板,空间std添加模板特。 这种专业化的未定义的行为一个标准库模板的结果(完全或部分),除非声明取决于外部连接的用户定义名称和除非专业化符合原始模板的标准库的要求。



Answer 3:

不要添加到标准的命名空间。 原因:如果每个人都这样做,标准命名空间将有名称冲突,这违背了一个命名空间的目的堆。

你的目标是你的类是“ost​​ream的,能”。 它并不需要在标准命名空间来做到这一点。 只要它是在什么namepsace你的类中声明,你的罚款。 把它在标准命名空间是不好的做法。



文章来源: Where should non-member operator overloads be placed?