2012-11-23 136 views
1

我試着編譯時收到此錯誤信息以下'std :: list <_Ty> :: push_back':無法將'this'指針從'const std :: list <_Ty>'轉換爲'std :: list <_Ty>''

void MyClass::MyFunc() const 
{ 
     int i= 0; 
     myList.push_back(i); 
} 

我已經吃過的常量,增加了功能,儘管它返回void,修復與功能本身的調用一個相同的問題,但現在,它的使用STL的成員發生,我在想我的代碼是非常錯誤的。作爲參考,誤差

cannot convert 'this' pointer from 'const MyClass' to 'MyClass &' 

其實我有,因爲我繼承了這個從別人與編碼標準和最佳做法的一個非常濫用的關係發生了什麼事情的很少的想法。如果有人能告訴我這個問題是什麼問題,我應該在代碼中尋找什麼,這對我有很大的幫助。

+1

你不能將一個成員func標記爲「只讀」,然後期望它寫入沒有問題。 http://msdn.microsoft.com/en-us/library/6ke686zh(v=vs.110).aspx 另外,請注意「const int Func()」和「int Func()const」之間的區別。 – Gaminic

+3

這裏有一些關於'const'的含義的誤解:_I已經必須將const添加到函數中,儘管它返回void_。 'const'與函數返回的內容無關(除非它返回一個指向成員的指針/引用)。你應該看看原來的錯誤(你在添加'const'之前得到的那個錯誤),並試圖理解爲什麼你調用MyFunc()的對象是一個常量對象。 – jogojapan

回答

2

const上的方法意味着它不能修改它被調用的實例,包括任何實例成員。

你需要看看代碼庫,並且可以修改類實例(這不應該是const)和那些只是提供關於類實例的信息(這應該是const)方法之間的區別。

2

如果myListMyClass一個數據成員,與push_back()要修改的數據myList構件(因此要修改的MyClassthis指向的實例),因此MyFunc()方法不能被標記爲const

0

$ 9.3.1/3:當不是用於形成指向成員(5.3.1)的指針的id-表達式(5.1)不是類成員訪問語法(5.2.5)的一部分時如果名稱查找(3.4)將id表達式中的名稱解析爲某個類C的非靜態非類型成員,並且如果可以評估id表達式,或者C是X或X的基類,使用(* this)(9.3.2)作爲後綴表達式將id表達式轉換爲類成員訪問表達式(5.2.5)到 的左邊。運營商。

這意思是,表達

myList.push_back(i); 

作爲

(*this).myList.push_back(i); 

$ 9.3.1/4處理:非靜態成員函數可以被聲明爲const,易失性或const volatile 。這些cv限定符影響這個指針的類型(9.3.2)。

$ 9.3.2/1:在非靜態(9.3)成員函數的主體中,關鍵字this是一個prvalue表達式,其值是調用該函數的對象的地址。 X類的成員函數中的類型是X *。如果成員函數聲明爲const,則其類型爲const X *,如果成員函數聲明爲volatile,則其類型爲volatile X *,並且如果成員函數聲明爲const volatile,則其類型爲const揮發性X *。

總之,這意味着你的成員函數中'this'的類型'const'是'MyClass const *'。實際上,這意味着Myclass::MyFunc不允許修改'this'指針指向的對象的狀態。

假設myList的類型爲std :: list,std :: list :: push_back方法修改實例變量'myList',因爲它在列表中插入'i'的值。

但是這打破了'const'成員函數MyClass::MyFunc的語義,它承諾它不會修改對象的狀態。

所以,你真的需要從這個成員函數中刪除'const'或者使用const_cast去除這個特定操作的const。

相關問題