在下面的 C++ 代码中,foobar
首先为单个double
参数定义 ,然后再次为类型为 的单个参数定义Foo
。两者都在全局命名空间中定义。
在one
命名空间中,定义了进一步的重载foobar
,带有一个类型的参数Bar
。从这个版本开始,带有参数 (42.0)foobar
的非限定调用将失败。对 的类似调用,这次使用 (::) 范围解析运算符限定,也带有参数,但会成功。foobar
double
foobar
double
另一方面,foobar
使用 type 参数对的非限定调用Foo
成功。使用范围解析运算符限定foobar
的参数调用也成功。Foo
为什么这两种情况表现不同?我同时使用 gcc 4.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;
}
};