C ++での名前空間と演算子のオーバーロード
-
05-07-2019 - |
質問
特定の名前空間でライブラリを作成する場合、その名前空間のクラスにオーバーロードされた演算子を提供すると便利なことがよくあります。 (少なくとも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つのオプションの間に実際的な違いはありますか?どちらのアプローチが良いですか?
解決
ライブラリの名前空間で定義する必要があります。 とにかく、コンパイラは引数依存のルックアップを通してそれらを見つけます。
グローバル名前空間を汚染する必要はありません。
他のヒント
Koenigルックアップが原因で、ライブラリのネームスペースに配置できます。
構文は冗長性が低くなり、グローバルな名前空間を乱雑にしないため、名前空間で定義する必要があります。
実際には、クラス定義でオーバーロードを定義すると、これは議論の余地のある質問になります。
namespace Lib {
class A {
public:
A operator+(const A&);
};
} // namespace Lib
所属していません StackOverflow