如何调用非常数运算符

How to call a non-const operator?

本文关键字:非常 运算符 调用 何调用      更新时间:2023-10-16

所以我在尝试调用特定运算符时遇到了问题。在某些课程中,我得到了:

template <class Object>
const Object& MyVector<Object>::operator[] (int index ) const {
    if (index < 0 || index >= mSize)
        throw MyException();
    return mObjects[index];
}

我还得到了

template <class Object>
Object& MyVector<Object>::operator[]( int index ){
    if (index < 0 || index >= mSize)
        throw MyException();
    return mObjects[index];
}

我想调用第二个,这样我就可以修改值,但编译器一直告诉我不能这样做,因为我正在试图修改一个常量。

以下是我尝试使用操作员功能的地方:

template <class Object>
const Object& Matrix<Object>::get(int r, int c) const{
    MyObject *row = & MyVectorObject[r]; //error
    //snipped
}

我一直收到错误:无法从const MyObject *转换为MyObject *

若要调用对象的非常数成员函数(包括运算符),对象/引用必须是非常数。如果函数是通过指针调用的,那么它必须是指向非常数的指针。

在您的案例中,MyVectorObject是const,因此调用了const重载。从您的代码中看不出来,为什么它是const,但在注释中您揭示了它是一个成员。成员是通过this指针隐式访问的,在const成员函数内部,this当然是指向const的指针。

Matrix<Object>::get()方法是const,因此如果您在该方法中访问Matrix的类属性,则所有这些属性都将被视为const。

CCD_ 7将有效地调用CCD_。

CCD_ 9将返回一个CCD_。

因此MyVectorObject[r]const Object&型,& MyVectorObject[r]将是const Object *

你应该写:const MyObject *row = & MyVectorObject[r];