我是一个新手C++程序员,所以这可能会变得很混乱。
我正在编写一个程序,将一个二进制Windows ETL文件转换为Wireshark PCAPNG。更准确地说,我正在修复一个由于ETL格式更改而出现的错误。为了修复这个bug,我需要在代码中添加一个回调。以下是代码中的相关部分:
#include <iostream>
#include <fstream>
#include <functional>
// Ng Block Buffer
typedef struct _NG_BLK_BUFFER {
    int blockType = 0;
    // ...
} NG_BLK_BUFFER;
class RingBuffer
{
public:
    // ...
    std::function<void(NG_BLK_BUFFER*)> framePayloadWriter;
};
class PcapNgFile : public std::ofstream
{
public:
    // ...
    PcapNgFile(const std::wstring fileName, size_t ringBufferSize);
    void writeEPB();
    // ...
    RingBuffer* ringBuffer;
};
PcapNgFile::PcapNgFile(const std::wstring fileName, size_t ringBufferSize)
{
    // ...
    this->ringBuffer = new RingBuffer();
    this->ringBuffer->framePayloadWriter = std::bind(&PcapNgFile::writeEPB, this, std::placeholders::_1);
}
void PcapNgFile::writeEPB()
{
    std::cout << "Writing an EPB" << std::endl;
}
int wmain(int argc, wchar_t** argv)
{
    PcapNgFile* myPcapNg = new PcapNgFile(L"test.pcap", 1);
}对于第36行,我得到了错误:
Error   C2679   binary '=': no operator found which takes a right-hand operand of type 'std::_Binder<std::_Unforced,void (__thiscall PcapNgFile::* )(void),PcapNgFile *,const std::_Ph<1> &>' (or there is no acceptable conversion)第36行是:
this->ringBuffer->framePayloadWriter = std::bind(&PcapNgFile::writeEPB, this, std::placeholders::_1);我做错了什么?
发布于 2020-01-09 19:39:12
writeEPB不带参数,但是你想把它绑定到一个带参数的函数上,把它改成writeEPB(NG_BLK_BUFFER*)。
如果要忽略回调中的参数,请从绑定调用中删除占位符:
this->ringBuffer->framePayloadWriter = std::bind(&PcapNgFile::writeEPB, this);使用lambda而不是std::bind可能会稍微更有效一些,并且倾向于给出更好的错误消息。例如:
this->ringBuffer->framePayloadWriter = [this](){ writeEPB(); };给出一个更容易理解的错误消息,正确的lambda应该是:
this->ringBuffer->framePayloadWriter = [this](NG_BLK_BUFFER*){ writeEPB(); };https://stackoverflow.com/questions/59663092
复制相似问题