Warum kann eine Klassenmethode keine globale Funktion mit demselben Namen aufrufen?

Der folgende Code zeigt einen Funktionsaufruf einer anderen Funktion.
Beide haben denselben Namen, aber unterschiedliche Signaturen.
Dies funktioniert wie erwartet.

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

int main(){
  foo();
}

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

Der einzige Unterschied, den ich jetzt machen werde, ist, eine der Funktionen in eine Struktur zu packen:

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

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

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

Dies kann nicht kompiliert werden.

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

Ich verstehe nicht, warum foo (int) als Methode aufgerufen werden soll, wenn die globale Funktion existiert.
s erwähnt nichts über Mehrdeutigkeit, es kann nur die Funktion nicht finde

Warum passiert das und wie kann ich das beheben?

Randnotiz Ich verpacke alten C-Code in einen C ++ - Wrapper, und die meisten C ++ - Methoden rufen die globalen C-Funktionen auf, die implizit die umgebrochene Struktur übergeben. Es ist eine ähnliche Situation wie oben (in Bezug auf Compilerfehler).

Antworten auf die Frage(2)

Ihre Antwort auf die Frage