Почему метод класса не может вызвать глобальную функцию с тем же именем?
Следующий код показывает вызов функции другой функции.
Оба имеют одинаковое имя, но разные подписи.
Это работает как ожидалось.
//declarations
void foo();
void foo(int);
int main(){
foo();
}
//definitions
void foo(){
foo(1);
}
void foo(int){}
Единственное отличие, которое я сейчас сделаю, - это обернуть одну из функций в структуру:
//declarations
struct Bar{
void foo();
};
void foo(int);
int main(){
Bar bar;
bar.foo();
}
//definitions
void Bar::foo(){
foo(1);
}
void foo(int){}
Это не в состоянии скомпилировать.
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
Я не понимаю, почему он хочет вызывать foo (int) как метод, когда существует глобальная функция.
Он не упоминает ничего о двусмысленности, он просто не может найти функцию.
Почему это происходит, и как я могу это исправить?
Примечание: Я упаковываю старый код C в оболочку C ++, и большинство методов C ++ являются вызовами глобальных функций C, которые неявно передают упакованную структуру. Это похоже на то, что происходит выше (с точки зрения ошибок компилятора).