38

特定の名前空間でライブラリを作成する場合、その名前空間のクラスにオーバーロードされた演算子を提供すると便利なことがよくあります。(少なくとも 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 つのオプションに実際的な違いはありますか? どちらのアプローチが良いですか?

4

3 に答える 3

38

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

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

于 2008-10-05T12:03:24.857 に答える
16

Koenig lookupにより、ライブラリの名前空間に配置できます。

于 2008-10-05T12:21:18.487 に答える
2

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

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

namespace Lib {

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

} // namespace Lib
于 2008-10-05T12:20:24.183 に答える