使用 boost bind 时无效使用非静态成员函数 - C++
invalid use of non-static member function when using boost bind - c++
我正在尝试使用 boost.asio 库生成周期性计时器 class。但是,我收到 "invalid use of non-static member function" 错误。 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 个错误,它们是:
错误:非静态成员函数的使用无效
tim.async_wait(boost::bind(print, &tim, &tSec));
错误:非静态成员函数的使用无效
tim.async_wait(boost::bind(print, &tim, &tSec));
错误:非静态成员函数的使用无效
tim->async_wait(boost::bind(print, tim, tSec));
你知道错误的解决方法吗?谢谢!
你有两个问题:
首先是非静态成员函数需要一个对象被调用。这通常作为隐藏的第一个参数传递。您可以通过将 this
作为第一个参数传递给要调用的成员函数来解决此问题。
第二个问题是需要使用成员函数的显式指针。这是通过完全确定范围并使用地址运算符 &
.
来完成的
所以工作 bind
调用应该类似于:
boost::bind(&TimerBoost::print, this, &tim, &tSec)
通常优于 "binding" 的另一种可能的解决方案是使用 lambdas:
tim.async_wait([tim, tSec, this]()
{
print(&tim, &tSec);
});
我正在尝试使用 boost.asio 库生成周期性计时器 class。但是,我收到 "invalid use of non-static member function" 错误。 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 个错误,它们是:
错误:非静态成员函数的使用无效
tim.async_wait(boost::bind(print, &tim, &tSec));
错误:非静态成员函数的使用无效
tim.async_wait(boost::bind(print, &tim, &tSec));
错误:非静态成员函数的使用无效
tim->async_wait(boost::bind(print, tim, tSec));
你知道错误的解决方法吗?谢谢!
你有两个问题:
首先是非静态成员函数需要一个对象被调用。这通常作为隐藏的第一个参数传递。您可以通过将 this
作为第一个参数传递给要调用的成员函数来解决此问题。
第二个问题是需要使用成员函数的显式指针。这是通过完全确定范围并使用地址运算符 &
.
所以工作 bind
调用应该类似于:
boost::bind(&TimerBoost::print, this, &tim, &tSec)
通常优于 "binding" 的另一种可能的解决方案是使用 lambdas:
tim.async_wait([tim, tSec, this]()
{
print(&tim, &tSec);
});