我有一个简单的类,用于将整数转换为字节数组。
class mc_int {
private:
int val; //actual int
public:
int value(); //Returns value
int value(int); //Changes and returns value
mc_int(); //Default constructor
mc_int(int);//Create from int
void asBytes(char*); //generate byte array
mc_int& operator=(int);
mc_int& operator=(const mc_int&);
bool endianity; //true for little
};
对于转换和更简单的用法,我决定添加operator=
方法。但我认为mc_int& operator=(const mc_int&);
的实施不正确。
mc_int& mc_int::operator=(const mc_int& other) {
val = other.value();
// |-------->Error: No instance of overloaded function matches the argument list and object (object has type quelifiers that prevent the match)
}
这可能是什么?我尝试使用other->value()
,但这也是错误的。
答案 0 :(得分:10)
您的成员函数value()
不是const
函数,这意味着它有权修改成员,并且无法在const
个对象上调用。由于我假设您将其视为只读,因此请将其更改为int value() const;
。然后,您可以在const
个mc_int
个实例上调用它,并保证您不会意外更改任何成员。
当它说“对象有类型限定符等等”时,这意味着对象有太多const
或volatile
限定符来访问函数。
此外,由于您发布了错误的摘要,我假设您正在使用visual studio。 Visual Studio在“错误”窗口中显示错误摘要。转到View->输出以查看其可怕细节中的完整错误,这些错误本应告诉您哪个变量是问题,并且由于它是const
而无法调用该函数。
答案 1 :(得分:3)
在此重载的operator=
中,other
是const
引用。您只能在此对象上调用标记为const
的成员函数。由于value()
函数只返回val
并且不修改对象,因此应将其标记为const
:
int value() const;
这表示此函数不会修改对象的状态,因此可以在const
个对象上调用。
答案 2 :(得分:2)
尝试更改:
int value(); //Returns value
要:
int value() const; //Returns value