Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 非成员运算符重载应放置在何处?_C++_Namespaces_Operator Overloading - Fatal编程技术网

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 ) {}