-1

考虑以下代码:

namespace myNS {
class MyClass {

//.....
};
} //end of namespace myNS


using namespace myNS;

//overloading of '<<' operator
std::ostream &myNS::operator<<(std::ostream &os, MyClass &c){  /*....*/ } 

在最后一行,为什么&myNS::需要?

4

2 回答 2

2

&之所以需要,是因为按照惯例,流操作符会返回对流的引用以允许它们被链接:

stream << something << something_else;

传递给由 .something_else返回的流引用stream << something

myNS::如果此运算符应该在命名空间内限定范围,则需要,在这种情况下,命名空间内还必须有一个先前的声明。如果您希望运算符位于当前命名空间(本例中可能是全局命名空间)中,则不需要它。

于 2012-09-01T15:15:52.483 回答
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";
}
于 2012-09-01T15:30:31.707 回答