¿Por qué un método de clase no puede llamar a una función global con el mismo nombre?

El siguiente código muestra una función que llama a otra función.
Ambos tienen el mismo nombre, pero firmas diferentes.
Esto funciona como se esperaba.

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

int main(){
  foo();
}

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

La única diferencia que haré ahora es envolver una de las funciones en una estructura:

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

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

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

Esto no se compila.

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

No entiendo por qué quiere llamar a foo (int) como método, cuando existe la función global.
No menciona nada sobre ambigüedad, simplemente no puede encontrar la función.

¿Por qué sucede esto y cómo puedo solucionarlo?

nota al margen: Estoy envolviendo el código C antiguo en un contenedor C ++, y la mayoría de los métodos C ++ son llamadas a las funciones globales de C que pasan implícitamente en la estructura envuelta. Es una situación similar a lo que está sucediendo arriba (en términos de errores del compilador).

Respuestas a la pregunta(1)

Su respuesta a la pregunta