所以我在尝试呼叫特定运营商时遇到了麻烦。在某些课程中,我给出了:
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 *
答案 0 :(得分:2)
要调用对象的非const成员函数(包括运算符),对象/引用必须是非const。如果通过指针调用该函数,则它必须是指向非const的指针。
在你的情况下MyVectorObject
是const,因此调用了const重载。从你的代码中看不出来,为什么它是const,但在评论中你揭示它是一个成员。成员通过this
指针隐式访问,内部const成员函数this
当然是指向const的指针。
答案 1 :(得分:0)
Matrix<Object>::get()
方法是const,因此如果您在该方法中访问Matrix的类属性,则所有这些属性都将被视为const。
MyObject *row = & MyVectorObject[r]
将有效地调用const Object& MyVector<Object>::operator[] (int index ) const
。
const Object& MyVector<Object>::operator[] (int index ) const
将返回const Object&
。
因此MyVectorObject[r]
的类型为const Object&
,而& MyVectorObject[r]
的类型为const Object *
你应该写:
const MyObject *row = & MyVectorObject[r];