【发布时间】:2012-08-06 02:38:57
【问题描述】:
在下面的 C++ 代码中,首先为单个 double 参数定义 foobar,然后为 Foo 类型的单个参数再次定义。两者都在全局命名空间中定义。
在one 命名空间中,定义了foobar 的进一步重载,带有Bar 类型的单个参数。在此版本的 foobar 中,使用 double 参数 (42.0) 对 foobar 的非限定调用将失败。对 foobar 的类似调用,这次使用 (::) 范围解析运算符限定,也使用 double 参数,但会成功。
另一方面,对foobar 的非限定调用(带有Foo 类型的参数)成功。使用Foo 参数调用foobar,并由范围解析运算符限定,也会成功。
为什么这两种情况的行为不同?我同时使用 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;
}
};
【问题讨论】:
标签: c++ namespaces operator-overloading scope-resolution