C++ 非成员运算符重载应放置在何处?
我想重载C++ 非成员运算符重载应放置在何处?,c++,namespaces,operator-overloading,C++,Namespaces,Operator Overloading,我想重载操作符您应该将操作符重载放在与类相同的命名空间中 这将允许在重载解析期间使用参数相关的查找来查找运算符(实际上,由于ostream位于名称空间std,如果将其置于名称空间std,也会找到重载,但没有理由这样做) 从良好设计实践的角度来看,操作符重载更多地是类接口的一部分,而不是ostream的接口,因此它与类属于同一名称空间(另请参见Herb Sutter的名称空间) 从编写符合标准且可移植的代码的角度来看,不能将运算符重载放入命名空间std。虽然可以将用户定义实体的模板专门化添加到命名
操作符您应该将操作符重载放在与类相同的命名空间中
这将允许在重载解析期间使用参数相关的查找来查找运算符(实际上,由于ostream
位于名称空间std
,如果将其置于名称空间std
,也会找到重载,但没有理由这样做)
从良好设计实践的角度来看,操作符重载更多地是类接口的一部分,而不是ostream
的接口,因此它与类属于同一名称空间(另请参见Herb Sutter的名称空间)
从编写符合标准且可移植的代码的角度来看,不能将运算符重载放入命名空间std
。虽然可以将用户定义实体的模板专门化添加到命名空间std
,但不能添加额外的函数重载。不要添加到标准命名空间。
原因:如果每个人都这样做,标准名称空间将有大量的名称冲突,这将破坏名称空间的用途
你的目标是让你的班级成为“有团队能力的”。要做到这一点,它不需要位于标准名称空间中。只要它以任何名称声明您的类,您就可以了。将其放入标准名称空间将是一种糟糕的做法 不要将它添加到std
命名空间中,请将它与类放在同一命名空间中。命名空间的目的是防止冲突。标准上说
17.4.3.1保留名称
<>对于C++程序来说,它是未定义的
将声明或定义添加到
命名空间std或其中的命名空间
名称空间标准,除非另有规定
明确规定。程序可以添加模板
任何标准的专业化
命名空间std的库模板。
这种专门化(完全的或完全的)
标准库的局部(局部)
模板导致未定义的行为
除非声明取决于
外部链接的用户定义名称
除非专业化满足
图书馆的标准要求
原始模板
它违背了<代码> STD< /Cord>命名空间的目的,这是C++标准库代码。哪个用户代码不是。考虑到Sam的回答和引用标准,最后一句话真的正确吗。@chubsdad:是的,我想是的:你可以添加专门化;不能添加重载。如果要为std中的类添加重载(例如std::nullptr\u t、std::unique\u ptr等),该怎么办?
class MyClass {
};
namespace std {
ostream& operator<< ( ostream& Ostr, const MyClass& MyType ) {}
}
class MyClass {
};
std::ostream& operator<< ( std::ostream& Ostr, const MyClass& MyType ) {}