为什么类方法不能调用具有相同名称的全局函数?

Tre*_*key 2 c++ methods overloading function function-prototypes

下面的代码显示了一个函数调用另一个函数.
两者都具有相同的名称,但签名不同.
这按预期工作.

//declarations
void foo();
void foo(int);

int main(){
  foo();
}

//definitions
void foo(){
    foo(1);
}
void foo(int){}
Run Code Online (Sandbox Code Playgroud)

我现在要做的唯一区别是将其中一个函数包装到一个结构中:

//declarations
struct Bar{
    void foo();
};
void foo(int);

int main(){
  Bar bar;
  bar.foo();
}

//definitions
void Bar::foo(){
    foo(1);
}
void foo(int){}
Run Code Online (Sandbox Code Playgroud)

这无法编译.

In member function ‘void Bar::foo()’:
error: no matching function for call to ‘Bar::foo(int)’
         foo(1);
              ^
note: candidate: void Bar::foo()
     void Bar::foo(){
          ^
note:   candidate expects 0 arguments, 1 provided
Run Code Online (Sandbox Code Playgroud)

当全局函数存在时,我不明白它为什么要调用foo(int)作为方法.
它没有提到任何关于歧义的东西,它只是找不到功能.

为什么会发生这种情况,我该如何解决?

旁注: 我将旧的C代码包装在C++包装器中,并且大多数C++方法都是对全局C函数的调用,这些函数隐式传入包装的结构.这与上面发生的情况类似(在编译器错误方面).

SHR*_*SHR 10

成员函数隐藏全局.它在类上下文中找到名称,因此它不会继续在其他上下文中搜索它.

你需要像这样调用它:

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

另一个解决方案是在函数内使用forward声明,如下所示:

void Bar::foo()
{
    void foo(int);
    foo(1);
}
Run Code Online (Sandbox Code Playgroud)

正如Praetorian所说,这是另一种选择:

void Bar::foo()
{
    using ::foo;
    foo(1);
}
Run Code Online (Sandbox Code Playgroud)