Передача метода класса в другой метод и в QMap, с++

class XM : public QObject
{
    Q_OBJECT

public:
    explicit XM(  QObject *parent = nullptr);
    void login();

private:
    quint32 counter;
    typedef void(XM::*callback)(quint32);
    QMap<qint32, callback > commands;
    quint32 send(callback cb);
    void login_cb();

private slots:
    void ready();

};


void XM::login()
{
    this->send(&XM::login_cb);
}

quint32 XM::send(callback cb)
{
    // тут отправили задачу на сервер
    this->commands.insert(this->counter, cb);
    this->counter+=2;
}

void XM::ready(quint32 counter, quint32 data)
{
    // тут приняли ответ
    callback fut = this->commands.take(counter);
    fut(data);
}

void XM::login_cb(quint32 data)
{
    // тут нужен тот же this, что был в login
    qDebug() << data;
}

Вот такой код, если выкинуть всё мясо.

Ошибка

ошибка: called object type 'XM::callback' (aka 'void (XM::*)(quint32)') is not a function or function pointer

Ответы (1 шт):

Автор решения: AR Hovsepyan

Для вызова не статического метода нужен объект, поэтому просто пишите так:

void XM::ready(quint32 counter, quint32 data)
{
    // тут приняли ответ
    (this->*(commands.take(counter)))(data);
}

Во вторых, сигнатуры объявленных методов не соответствуют сигнатуре в определении. В частности XM::login_cb не имеет аргумента, а вы определяете ее как с одним аргументом.То же самое касается и слоту ready. Просто пересмотрите внимательно.

→ Ссылка