9

在下面的 C++ 代码中,foobar首先为单个double参数定义 ,然后再次为类型为 的单个参数定义Foo。两者都在全局命名空间中定义。

one命名空间中,定义了进一步的重载foobar,带有一个类型的参数Bar。从这个版本开始,带有参数 (42.0)foobar的非限定调用将失败。对 的类似调用,这次使用 (::) 范围解析运算符限定,也带有参数,但会成功。foobardoublefoobardouble

另一方面,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;
  }
};
4

1 回答 1

8

参数依赖查找

foobar(f)从命名空间调用函数时Foo会考虑。

不起作用,double因为该类型未在任何命名空间中声明。

于 2012-08-08T22:03:36.717 回答