编译错误C2662

时间:2014-07-18 01:03:27

标签: c++ c++11 const pass-by-reference

我正在尝试传递一个对象作为对一个接受该对象作为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?

1 个答案:

答案 0 :(得分:5)

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

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

而是将函数声明为

int GetData() const;