Просто объясним ошибки более подробно, так как истинный ответ уже дан ;Вы получаете два из них для одной и той же проблемы:
inline const double& getX() const { return this->getX; }
// ^ ^ (!)
Заметили ли вы, что два идентификатора одинаковы?Когда вы пытаетесь вернуть getX
, функция уже объявлена и известна.И теперь вы пытаетесь вернуть именно эту функцию.
Error C3867 'Player::getX': non-standard syntax; use '&' to create a pointer to member
С помощью функций-членов вы можете сделать две вещи: либо вызвать их, либо получить их адрес, чтобы сформировать указатель на функцию-член.В отличие от автономных функций и статических функций-членов, нестатические функции-члены не преобразуются автоматически в указатели;для этого вам нужно явно указать оператор адреса &
:
void f() { }
class C { public: void f() { } };
void (*pf0)() = &f; // explicitly taking address
void (*pf1)() = f; // works for free standing functions
void (C::*pf0)() = &C::f // ONLY can explicitly take address
//void (C::*pf1)() = C::f // gives you the error you saw already
Что ж, синтаксис для указателей на функции, особенно член FP, действительно ужасен.Обычно вам лучше определить псевдонимы (typedef
или using
) или, в вышеупомянутом случае, вы могли бы использовать auto
.
Error C2440 'return': cannot convert from 'const double &(__thiscall Player::* )(void) const' to 'const double &'
Предполагая, что вы уже исправилипервая ошибка (добавляя требуемый &
), затем у вас есть несоответствие типов между тем, что вы объявили как тип возвращаемого значения, и тем, что вы фактически возвращаете;первый - ссылка на double, последний - указатель на функцию-член.Таким образом, вы можете либо скорректировать возвращаемое значение (в данном случае это невозможно: вам нужно будет вернуть указатель на функцию, возвращающую указатель на функцию, возвращающую указатель на ...), или выбрать правильный член, как уже показано.
Если вас интересует __thiscall
: это просто соглашение о вызовах , которое нам обычно не нужно указывать явно (если только нам не нужно не-по умолчанию - как обычно бывает)если, например, кодирование против WinAPI).