编译错误C2662

Compile Error C2662

本文关键字:C2662 错误 编译      更新时间:2023-10-16

我试图传递一个对象作为一个函数的引用,该函数接受该对象作为const,但编译器抛出:

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传递到f_Callback作为const引用?

问题是在回调中,DataPacket对象Packet被标记为const。这意味着不能在对象中调用非const函数。

这可以简单地通过使GetData成员函数const来改变,不,这不是你所做的,你只是使返回的整数const,这没有意义(因为值只是被复制并且失去了它的const-ness)。

将函数声明为

int GetData() const;