C ++ Сохранение указателя на функцию-член на переменную класса - PullRequest
0 голосов
/ 09 января 2020

Я новичок ie Программист C ++, так что это может запутаться.

Я пишу программу для преобразования двоичного Windows ETL-файла в Wireshark PCAPNG. Чтобы быть более точным, я исправляю ошибку, возникшую из-за изменения формата ETL. Чтобы исправить ошибку, мне нужно добавить обратный вызов в мой код. Вот соответствующие разделы из кода:

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

Что я делаю не так?

1 Ответ

1 голос
/ 09 января 2020

writeEPB не принимает параметров, но вы пытаетесь привязать его к функции, которая принимает параметры, измените ее на writeEPB(NG_BLK_BUFFER*).

Если вы хотите игнорировать параметр в обратном вызове, удалите заполнитель из вашего связанного вызова:

this->ringBuffer->framePayloadWriter = std::bind(&PcapNgFile::writeEPB, this);

Использование лямбды вместо std::bind может быть немного более эффективным и, как правило, дает лучшие сообщения об ошибках. Например:

this->ringBuffer->framePayloadWriter = [this](){ writeEPB(); };

дает более понятное сообщение об ошибке, правильная лямбда будет:

this->ringBuffer->framePayloadWriter = [this](NG_BLK_BUFFER*){ writeEPB(); };
...