2014-10-09 75 views
1

所以我在嘗試調用特定的操作員時遇到了問題。在一些班級,我給出:如何調用非常量運算符?

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 *

+3

如何'MyVectorObject'聲明? – 2014-10-09 10:24:42

+1

你的'MyVectorObject'是否爲常量? – P0W 2014-10-09 10:24:59

+0

您沒有獲得修改這些對象的權限,所以不要這樣做。 – 2014-10-09 10:26:51

回答

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];

2

要調用非const成員函數(包括一個運算符),對象/引用必須是非const的。如果函數是通過指針調用的,它必須是一個指向非const的指針。

你的情況MyVectorObject是const,因此調用了const超載。從代碼中看不出來,爲什麼它是常量,但在評論中顯示它是成員。通過this指針和內部const成員函數this隱含地訪問成員當然是指向const的指針。