我的吸气剂给我一个非标准的东西,无法转换错误

时间:2019-05-21 06:35:47

标签: c++ const getter

我正在学习,但是在为字符的统计页面编写这些getter时,我得到一个错误,它是非标准的,它无法转换const,并且告诉我添加& “创建指向成员的指针”

我尝试使用*使其成为指针,我尝试不使其成为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 个答案:

答案 0 :(得分:7)

很难确定,因为您只写了带有错误的行,而不写了所有相关的代码。但是看来您已经编写了这样的代码

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

然后,正如注释中已经指出的,在这种情况下,inlinethis和引用的使用都是多余的或不好的。这样您就可以编写更简单的

class Player
{
public:
    double getX() const { return x; }
private:
    double x;
};

答案 1 :(得分:2)

只需更详细地解释错误,因为真正的答案已经是given;对于同一问题,您将获得其中两个:

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)的语法确实很笨拙。通常,最好定义别名(typedefusing),或者在上述情况下,您本可以使用auto

Error C2440 'return': cannot convert from 'const double &(__thiscall Player::* )(void) const' to 'const double &'

假设您已经解决了第一个错误(通过添加必需的&),那么在声明为返回类型的内容与实际返回的内容之间,类型就会不匹配;前者是对double的引用,后者是成员函数指针。因此,您可以调整返回值(在这种情况下是不可能的:您必须将指针返回到函数,将指针返回到函数,将指针返回到...),或者选择正确的成员(如已显示)。

如果您对__thiscall感到疑惑,那就是calling convention,我们通常不必明确指定它(除非我们需要非默认值,例如,例如针对WinAPI进行编码)。