编译错误C2662

KKl*_*zal 1 c++ const pass-by-reference c++11

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

error C2662: 'const int DataPacket::GetData(void)': cannot convert 'this' pointer from 'const DataPacket' to 'DataPacket &'
Run Code Online (Sandbox Code Playgroud)

智能感知说:

the object has type qualifiers that are not compatible with the member function
    object type is: const DataPacket
Run Code Online (Sandbox Code Playgroud)

我对代码进行了测试以演示该问题:

#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));
    }

}
Run Code Online (Sandbox Code Playgroud)

基本上我有一个STD函数,用户可以设置它使用自己的回调函数.当新数据包到达时,较低级别类会创建DataPacket类型的对象.然后我想将对象作为常量引用传递给回调函数,以便不复制整个对象并限制用户更改原始对象.

这里发生了什么?如何将DataPacket作为const引用传递给f_Callback?

Som*_*ude 5

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

这可以简单地通过创建GetData成员函数来改变const,并且不是你所做的,你只做了返回的整数const,这没有意义(因为这个值只是被复制并且松散了它的常量).

而是将函数声明为

int GetData() const;
Run Code Online (Sandbox Code Playgroud)