Por que um método de classe não pode chamar uma função global com o mesmo nome?

O código a seguir mostra uma função que chama outra função.
Ambos têm o mesmo nome, mas assinaturas diferentes.
Isso funciona conforme o esperado.

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

int main(){
  foo();
}

//definitions
void foo(){
    foo(1);
}
void foo(int){}

A única diferença que farei agora é envolver uma das funções em uma estrutura:

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

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

//definitions
void Bar::foo(){
    foo(1);
}
void foo(int){}

Isso falha ao compilar.

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

Eu não entendo por que ele quer chamar foo (int) como um método, quando a função global existe.
Não menciona nada sobre ambiguidade, simplesmente não consegue encontrar a função.

Por que isso está acontecendo e como posso corrigi-lo?

nota: Estou quebrando o código C antigo em um wrapper C ++, e a maioria dos métodos C ++ são chamadas para as funções globais C que passam implicitamente na estrutura quebrada. É uma situação semelhante ao que está acontecendo acima (em termos de erros do compilador).

questionAnswers(1)

yourAnswerToTheQuestion