【问题标题】:invalid use of non-static member function when using boost bind - c++使用boost绑定时无效使用非静态成员函数 - c++
【发布时间】:2018-11-07 11:18:23
【问题描述】:

我正在尝试使用 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));

你知道错误的解决方法吗?谢谢!

【问题讨论】:

    标签: c++ boost timer boost-asio boost-bind


    【解决方案1】:

    你有两个问题:

    第一个是非静态成员函数需要一个object才能被调用。这通常作为隐藏的第一个参数传递。您可以通过将this 作为第一个参数传递给您要调用的成员函数来解决此问题。

    第二个问题是您需要使用指向成员函数的显式指针。这是通过完全确定它的范围并使用地址运算符&amp; 来完成的。

    所以有效的bind 调用应该类似于:

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

    另一种可能的解决方案,通常比“绑定”更受欢迎,是使用lambdas

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

    【讨论】:

    • @AnılÇavuşoğlu 忘了一件事,现在添加它
    • 代理FGITW承担的风险。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 2019-05-13
    • 2016-01-12
    • 2023-03-12
    • 2013-10-14
    • 1970-01-01
    相关资源
    最近更新 更多