web-dev-qa-db-ja.com

C ++での名前空間と演算子のオーバーロード

特定の名前空間でライブラリを作成する場合、その名前空間のクラスにオーバーロードされた演算子を提供すると便利なことがよくあります。 (少なくともg ++では)オーバーロードされた演算子は、ライブラリの名前空間のいずれかに実装できるようです。

namespace Lib {
class A {
};

A operator+(const A&, const A&);
} // namespace Lib

またはグローバル名前空間

namespace Lib {
class A {
};
} // namespace Lib

Lib::A operator+(const Lib::A&, const Lib::A&);

私のテストから、それらは両方ともうまく機能しているようです。これら2つのオプションの間に実際的な違いはありますか?どちらのアプローチが良いですか?

36
jonner

それらはライブラリ名前空間で定義する必要があります。コンパイラは、引数に依存するルックアップを通じてとにかくそれらを見つけます。

グローバル名前空間を汚染する必要はありません。

36
David Pierre

ケーニッヒルックアップ のため、ライブラリ名前空間に入れることができます。

15
Ferruccio

構文が冗長でなく、グローバル名前空間が乱雑にならないため、名前空間で定義する必要があります。

実際、クラス定義でオーバーロードを定義すると、これは議論の余地のある質問になります。

namespace Lib {

class A {
public:
    A operator+(const A&);
};

} // namespace Lib
2
Ates Goral