Мои геттеры дают мне нестандартные и не могут конвертировать ошибки - PullRequest
0 голосов
/ 21 мая 2019

Я учусь по ходу дела, но при написании этих геттеров для страницы статистики для персонажа я получаю сообщение об ошибке, что оно нестандартно, оно не может преобразовать const и говорит мне добавить &«создать указатель на член»

Я пытался сделать их указателями с *, я пытался не делать их константными, делать их публичными, добавлять любые заголовки, которые могут отсутствовать.

Это единственные строки из многих, которые дают ошибки.Выдает около 30 ошибок.

inline const double& getX() const { return this->getX; }
inline const double& getY() const { return this->getY; }
inline const std::string& getName() const { return this->name; }
inline const int& getLevel() const { return this->level; }
inline const int& GetExpNext() const { return this->expNext; }
inline const int& getHP() const { return this->hp; }
inline const int& getStamina() const { return this->stamina; }
inline const int& getDamageMin() const { return this->getDamageMin; }
inline const int& getDamageMax() const { return this->getDamageMax; }
inline const int& getDefense() const { return this->getDefense; }

Вот некоторые из повторяющихся ошибок.

Error   C3867   'Player::getX': non-standard syntax; use '&' to create a pointer to member  
Error   C2440   'return': cannot convert from 'const double &(__thiscall Player::* )(void) const' to 'const double &'
Error   C3867   'Player::getY': non-standard syntax; use '&' to create a pointer to member  
Error   C2440   'return': cannot convert from 'const double &(__thiscall Player::* )(void) const' to 'const double &'
Error   C3867   'Player::getDamageMin': non-standard syntax; use '&' to create a pointer to member
Error   C2440   'return': cannot convert from 'const int &(__thiscall Player::* )(void) const' to 'const int &' 
Error   C3867   'Player::getDamageMax': non-standard syntax; use '&' to create a pointer to member  
Error   C2440   'return': cannot convert from 'const int &(__thiscall Player::* )(void) const' to 'const int &' 
Error   C3867   'Player::getDefense': non-standard syntax; use '&' to create a pointer to member    
Error   C2440   'return': cannot convert from 'const int &(__thiscall Player::* )(void) const' to 'const int &'
Error   C3867   'Player::getX': non-standard syntax; use '&' to create a pointer to member
Error   C2440   'return': cannot convert from 'const double &(__thiscall Player::* )(void) const' to 'const double &'
Error   C3867   'Player::getY': non-standard syntax; use '&' to create a pointer to member

Ответы [ 2 ]

7 голосов
/ 21 мая 2019

Трудно быть уверенным, потому что вы написали только опубликованные строки с ошибками вместо того, чтобы опубликовать весь соответствующий код. но, кажется, вы написали такой код

class Player
{
public:
    inline const double& getX() const { return this->getX; }
private:
    double x;
};

когда вы должны были написать код, подобный этому

class Player
{
public:
    inline const double& getX() const { return this->x; }
private:
    double x;
};

Примечание x не getX.

И затем, как уже указывалось в комментариях, inline, this и использование ссылок в этом случае являются избыточными или плохими. Таким образом, вы можете написать еще более простой

class Player
{
public:
    double getX() const { return x; }
private:
    double x;
};
3 голосов
/ 21 мая 2019

Просто объясним ошибки более подробно, так как истинный ответ уже дан ;Вы получаете два из них для одной и той же проблемы:

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

...