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).