Как уже говорили другие, компилятор пытается быть полезным и, вероятно, вводит вас в заблуждение. Начнем с самой простой ошибки:
ошибка: нет соответствующей функции для вызова obj.doSomething(ptr)
Хотя сообщение об ошибке верно, информация, которую оно предоставляет, очень ограничена. В этом примере код прост для подражания, но рассмотрим более сложный фрагмент кода. Вы читаете сообщение об ошибке, и вы можете подумать ... что такое obj ?, что такое ptr? Поэтому оно пытается вам помочь и говорит вам, что такое obj
:
ошибка: не найдена подходящая функция для вызова MyClass :: doSomething (ptr) '
Ну, это лучше, это говорит вам, по крайней мере, в каком классе вам нужно искать перегрузку, но учтите, что класс был std::ostream
, а функция operator<<
... слишком много перегрузок, и все же, какой тип ptr
? Таким образом, он движется вперед и пытается описать аргумент: Аргумент является lvalue типа YourClass*
... и я видел такой тип сообщения об ошибке, созданного в прошлом:
ошибка: не найдена соответствующая функция для вызова MyClass :: doSomething, который принимает в качестве аргумента значение YourClass*
.
Хорошо, значит, отчет об ошибке завершен. Теперь подумайте, что функция может иметь больше аргументов, и сообщение об ошибке может превратиться в сложного зверя (представьте список из 5 "r-значения типа XXX и l-значения типа YYY и ..."). Следующее - сделать синтаксис сообщения об ошибке таким же точным (важен аргумент lvalue аргумента, или важен rvalue , так что часть информация должна присутствовать). Поэтому он снова переписывает сообщение об ошибке:
ошибка: нет соответствующей функции для вызова call MyClass :: doSomething (YourClass * &) ’
Проблема в том, что вы пытаетесь интерпретировать это как сигнатуру функции, но это скорее описание вызова функции.
Сообщения об ошибках не определены в стандарте, и они отличаются от одного компилятора к другому, даже от одной версии к другой в пределах одного и того же компилятора. В конце дня вам нужно научиться читать сообщения об ошибках и их значение.