9

我有一个简单的类,旨在将整数转换为字节数组。

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(),但这也是错误的。

4

3 回答 3

17

您的成员函数value()不是const函数,这意味着它有权修改成员,并且不能在const对象上调用。由于我假设您的意思是只读的,因此将其更改为int value() const;. 然后您可以在 的const实例上调用它mc_int,它保证您不会意外更改任何成员。

当它说“对象有类型限定符等等等等”时,这意味着一个对象有太多constvolatile限定符来访问一个函数。

此外,由于您发布了错误摘要,我假设您使用的是 Visual Studio。Visual Studio 在“错误”窗口中显示错误摘要。转到查看->输出以查看其可怕细节的完整错误,它应该告诉您哪个变量是问题,并且由于它的原因它无法调用该函数const

于 2013-03-16T00:42:15.667 回答
3

尝试改变:

int value();  //Returns value

到:

int value() const;  //Returns value
于 2013-03-16T00:42:20.793 回答
3

在这个重载的operator=,other是一个const参考。您只能调用const在此对象上标记的成员函数。由于该value()函数只是返回val并且不修改对象,因此应将其标记为const

int value() const;

这表示此函数不会修改对象的状态,因此可以在const对象上调用。

于 2013-03-16T00:42:47.927 回答