以下のC++コードでfoobar
は、最初に単一のdouble
パラメーターに対して定義され、次にタイプがの単一のパラメーターに対して定義されていますFoo
。どちらもグローバル名前空間内で定義されます。
one
名前空間内で、foobar
タイプの単一のパラメーターを使用して、のさらなるオーバーロードが定義されますBar
。このバージョンのから、引数(42.0)を使用したfoobar
への修飾されていない呼び出しは失敗します。今回は(::)スコープ解決演算子で修飾され、引数も指定された、への同様の呼び出しは成功します。foobar
double
foobar
double
一方、foobar
型の引数を持つ、への修飾されていない呼び出しFoo
は成功します。スコープ解決演算子によって修飾されfoobar
た引数付きのへの呼び出しも成功します。Foo
2つのシナリオの動作が異なるのはなぜですか?私はgcc4.7とclang++3.2の両方を使用しています。
struct Foo {};
struct Bar {};
double foobar(double x) { return x; }
Foo foobar(Foo f) { return f; }
namespace one {
Bar foobar(Bar b) {
//foobar(42.0); // error: can't convert to Bar
::foobar(42.0);
Foo f;
foobar(f); // no problem
::foobar(f);
return b;
}
};