考虑以下代码:
namespace myNS {
class MyClass {
//.....
};
} //end of namespace myNS
using namespace myNS;
//overloading of '<<' operator
std::ostream &myNS::operator<<(std::ostream &os, MyClass &c){ /*....*/ }
在最后一行,为什么&myNS::
需要?
考虑以下代码:
namespace myNS {
class MyClass {
//.....
};
} //end of namespace myNS
using namespace myNS;
//overloading of '<<' operator
std::ostream &myNS::operator<<(std::ostream &os, MyClass &c){ /*....*/ }
在最后一行,为什么&myNS::
需要?
&
之所以需要,是因为按照惯例,流操作符会返回对流的引用以允许它们被链接:
stream << something << something_else;
传递给由 .something_else
返回的流引用stream << something
。
myNS::
如果此运算符应该在命名空间内限定范围,则需要,在这种情况下,命名空间内还必须有一个先前的声明。如果您希望运算符位于当前命名空间(本例中可能是全局命名空间)中,则不需要它。
由于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";
}