成员函数隐藏自由函数

fre*_*low 10 c++ visibility function overload-resolution

void foo(int)
{
}

class X
{
    void foo()
    {
    }

    void bar()
    {
        foo(42);
        // error: no matching function for call to 'X::foo(int)'
        // note: candidate is:
        // note: void X::foo()
        // note:   candidate expects 0 arguments, 1 provided        
    }
};
Run Code Online (Sandbox Code Playgroud)

为什么C++无法调用自由函数(这是唯一具有正确签名的函数)?

ken*_*ytm 12

因为这两个标识符是在不同的范围内定义的,而重载解析只涉及同一范围内的函数.一旦编译器发现该类具有a foo,它就会停止攀升到更宽的范围(C++11§3.4.1/ 1),因此foo隐藏了自由函数.

您需要使用限定名称来引用全局foo:

::foo(42);
Run Code Online (Sandbox Code Playgroud)


iam*_*ind 5

合乎逻辑的原因是一致性.

  • 假设根据建议,编译器解析foo(42)::foo(int).
  • 现在后的某个时间,如果你改变X::foo()X::foo(int)随后 foo(42)将被解析为X::foo(int).哪个不一致.

这就是为什么派生类函数在有相似名称时隐藏基类函数的原因.

这种情况可以通过两种方式解决;

(1)给出完全合格的名称(例如::foo(42))

(2)使用using效用; 例如

void bar()
{
  using ::foo;
  foo(42);
}
Run Code Online (Sandbox Code Playgroud)