我正在尝试传递一个对象作为对一个接受该对象作为const的函数的引用,但编译器正在抛出:
error C2662: 'const int DataPacket::GetData(void)': cannot convert 'this' pointer from 'const DataPacket' to 'DataPacket &'
IntelliSense说:
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?
答案 0 :(得分:5)
问题在于,在回调中,DataPacket
对象Packet
被标记为const
。这意味着你不能在对象中调用非const函数。
这可以通过使GetData
成员函数const
简单地改变,并且不是你没有做过的,你只做了返回的整数const,这没有意义(因为这个值)将被复制并松散它的常量。
而是将函数声明为
int GetData() const;