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