Следующий код показывает, как функция вызывает другую функцию.
У обеих функций одинаковое имя, но разные подписи.
Это работает, как и ожидалось.
//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, которые неявно передаются в обернутой структуре. Это похоже на то, что происходит выше (с точки зрения ошибок компилятора).