недопустимое использование нестатической функции-члена при использовании boost bind - c ++ - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь сгенерировать периодический класс таймера, используя библиотеку boost.asio. Тем не менее, я получаю ошибки "недопустимое использование нестатической функции-члена". Файл cpp выглядит следующим образом:

#include "TimerBoost.h"
#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <chrono>
#include <string>
using namespace std;
boost::asio::io_context io;

TimerBoost::TimerBoost(int timerSec)
{
    setParam(timerSec); //timerSec is the desired period of the timer in terms of second
    boost::asio::steady_timer tim{io, std::chrono::seconds{tSec}};
    tim.async_wait(boost::bind(print, &tim, &tSec));
    io.run();
}
TimerBoost::TimerBoost()
{
    setParam(5);
    boost::asio::steady_timer tim{io, std::chrono::seconds{tSec}};
    tim.async_wait(boost::bind(print, &tim, &tSec));
    io.run();
}
void TimerBoost::setParam(int timerSec)
{
    tSec=timerSec;
}
void TimerBoost::print(boost::asio::steady_timer* tim, int* tSec)
{
    tim->expires_from_now(boost::asio::chrono::seconds(*tSec));
    tim->async_wait(boost::bind(print, tim, tSec));
}

Файл заголовка имеет следующий вид:

#include <string>
#include <boost/asio/io_context.hpp>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <chrono>
#include <iostream>
#ifndef TIMERBOOST_H_
#define TIMERBOOST_H_

using namespace std;

class TimerBoost {
public:
    TimerBoost(int tSec);
    TimerBoost();
    void setParam(int tSec);
    void print(boost::asio::steady_timer* tim, int* tSec);

private:
    int tSec;
};
#endif /* TIMERBOOST_H_ */

Когда я строю проект, я получаю 3 ошибки:

  1. ошибка: недопустимое использование нестатической функции-члена

    tim.async_wait (boost :: bind (print, & tim, & tSec));

  2. ошибка: недопустимое использование нестатической функции-члена

    tim.async_wait (boost :: bind (print, & tim, & tSec));

  3. ошибка: недопустимое использование нестатической функции-члена

    tim-> async_wait (boost :: bind (print, tim, tSec));

Знаете ли вы решение ошибок? Спасибо!

1 Ответ

0 голосов
/ 07 ноября 2018

У вас есть две проблемы:

Во-первых, нестатической функции-члену требуется объект для вызова. Обычно это передается как скрытый первый аргумент. Вы решаете это, передавая this в качестве первого аргумента функции-члену, которую хотите вызвать.

Вторая проблема заключается в том, что вам нужно использовать явные указатели на функции-члены. Это делается путем полного определения области действия и использования оператора адреса &.

Таким образом, рабочий bind вызов должен выглядеть примерно так:

boost::bind(&TimerBoost::print, this, &tim, &tSec)

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

tim.async_wait([tim, tSec, this]()
{
    print(&tim, &tSec);
});
...