运算符重载中的作用域规则

时间:2012-09-01 14:45:01

标签: c++ operator-overloading

考虑以下代码:

namespace myNS {
class MyClass {

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


using namespace myNS;

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

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

2 个答案:

答案 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";
}