考虑以下代码:
namespace myNS {
class MyClass {
//.....
};
} //end of namespace myNS
using namespace myNS;
//overloading of '<<' operator
std::ostream &myNS::operator<<(std::ostream &os, MyClass &c){ /*....*/ }
在最后一行,为什么需要&myNS::
?
答案 0 :(得分:2)
&
是必需的,因为传统上,流操作符会返回对流的引用以允许它们被链接:
stream << something << something_else;
将something_else
传递给stream << something
返回的流引用。
myNS::
,在这种情况下,命名空间内也必须有一个先前的声明。如果您希望运算符位于当前名称空间(可能是此示例中的全局名称空间),则不需要它。
答案 1 :(得分:1)
由于std::ostream& operator<<(std::ostream&, MyClass&)
未在myNS
命名空间内声明,因此无需对其进行限定。这个等效代码是合法的:
#include <iostream>
namespace Foo
{
class Bar{};
}
using namespace Foo;
std::ostream& operator<<(std::ostream& o, const Bar&) { return o;}
int main()
{
Foo::Bar b;
std::cout << b << "\n";
}