2014-07-18 35 views
1

我想傳遞一個對象作爲一個函數的引用,它接受對象作爲一個const但是編譯器拋出:編譯錯誤C2662

error C2662: 'const int DataPacket::GetData(void)': cannot convert 'this' pointer from 'const DataPacket' to 'DataPacket &' 

智能感知說:

the object has type qualifiers that are not compatible with the member function 
    object type is: const DataPacket 

我做了一個測試代碼演示的問題:

#include <iostream> 
#include <functional> 

class DataPacket 
{ 
    int SomeVar; 
public: 
    DataPacket(int InitialData) 
    { 
     SomeVar = InitialData; 
    } 

    const int GetData() 
    { 
     return SomeVar; 
    } 
}; 

void ProcessPacket(const DataPacket& Packet) 
{ 
    std::cout << Packet.GetData() << std::endl; 
} 

int main() 
{ 
    std::function<void(const DataPacket& Packet)> f_Callback; 
    f_Callback = ProcessPacket; 

    while (true) 
    { 
     f_Callback(DataPacket(10)); 
    } 

} 

基本上我有一個STD功能,用戶可以設置爲使用自己的回調函數。當新數據包到達時,較低級別的類創建DataPacket類型的對象。然後我想將對象作爲常量引用傳遞給回調函數,以便不復制整個對象並限制用戶更改原始對象。

這是怎麼回事?如何將DataPacket作爲const引用傳入f_Callback?

回答

5

問題是,在回調中,DataPacket對象Packet被標記爲const。這意味着你不能在對象中調用非const函數。

這可以簡單地通過使GetData成員函數const改變,並沒有這不是你做了什麼,你只有做返回的整數常數,這是沒有意義的(因爲該值將只是複製和鬆散它的常量性)。

相反聲明功能

int GetData() const; 
+0

非常感謝你,這是解決方案。我可以問一下在開始時將const放在最後的區別是什麼? – KKlouzal

+1

@KKlouzal如果你把'const'放在bginning中(就像你在你的問題中那樣),然後你把*返回的值*'const',如果你把它放在函數之後,最後你做*函數*常量(即告訴編譯器它不會改變對象中的任何東西)。 –