C++ asio如何将成员函数传递给acceptor.async_accept()
我试图将一个成员函数作为AcceptHandler传递给boost::asio的async_accept()方法。我得到一个编译错误,它说: 未满足AcceptHandler类型要求 从链接行: //如果在下一行中出现错误,则表示您的处理程序不符合AcceptHandler的文档化类型要求 说明处理程序必须如下所示:C++ asio如何将成员函数传递给acceptor.async_accept(),c++,boost,handler,C++,Boost,Handler,我试图将一个成员函数作为AcceptHandler传递给boost::asio的async_accept()方法。我得到一个编译错误,它说: 未满足AcceptHandler类型要求 从链接行: //如果在下一行中出现错误,则表示您的处理程序不符合AcceptHandler的文档化类型要求 说明处理程序必须如下所示: void accept_handler(const boost::system::error_code& error) //documentation { if (!e
void accept_handler(const boost::system::error_code& error) //documentation
{
if (!error)
{
// Accept succeeded.
}
}
void WifiConnector::onAccept(const boost::system::error_code &ec) //my code
{
if (ec) {
std::cout << ec.message();
return;
}
socket.async_read_some(boost::asio::buffer(mBuffer), &WifiConnector::readHandler);
}
acceptor.async_accept(socket, &WifiConnector::onAccept); //my code
我的成员函数如下所示:
void accept_handler(const boost::system::error_code& error) //documentation
{
if (!error)
{
// Accept succeeded.
}
}
void WifiConnector::onAccept(const boost::system::error_code &ec) //my code
{
if (ec) {
std::cout << ec.message();
return;
}
socket.async_read_some(boost::asio::buffer(mBuffer), &WifiConnector::readHandler);
}
acceptor.async_accept(socket, &WifiConnector::onAccept); //my code
而不是
acceptor.async_accept(socket, accept_handler); //documentation
因为我假设它是一个成员函数。如果我试着像文档中建议的那样传递它:
acceptor.async_accept(socket, onAccept); //my code
错误是:没有重载函数的实例
错误是因为我以错误的方式传递成员函数还是我做错了什么?
编辑:
我从保存接受程序等的对象中调用async_accept()方法
错误是因为我以错误的方式传递成员函数,还是我做错了什么
调用普通函数和调用(非静态)成员函数是有区别的。后者只能与适当的对象一起调用。因此,您必须使用多种方法之一转发呼叫。最简单的方法是使用lambda:
WifiConnector wifi;
...
acceptor.async_accept(socket, [&wifi] (const auto& ec) { wifi.onAccept(ec); } );
但是请注意,您必须认真考虑wifi对象的生命周期,因为其他线程现在可能通过引用访问它,并且依赖于拥有线程使对象保持活动状态。例如,在asio回调中,传递
共享\u ptr
或弱\u ptr
对象而不是普通引用(可能会挂起)是一种常见的做法 boost文档明确地提到了如何将非静态方法传递给接受方
摘自上述链接:
void my_class::accept_handler(
const boost::system::error_code& ec)
{
...
}
...
acceptor.async_accept(...,
boost::bind(&my_class::accept_handler,
this, boost::asio::placeholders::error));
如果您的类不可用,可以用实例替换
此。WifiConnector::onAccept的对象在哪里?它不是一个静态方法。它是在“别处”中创建的,只是得到一个启动调用。所有其他方法调用(如async\u accept()
)都在对象内完成。