次のコードを検討してください。
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";
}