C++ asio如何将成员函数传递给acceptor.async_accept()

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

我试图将一个成员函数作为AcceptHandler传递给boost::asio的async_accept()方法。我得到一个编译错误,它说:

未满足AcceptHandler类型要求

从链接行:

//如果在下一行中出现错误,则表示您的处理程序不符合AcceptHandler的文档化类型要求

说明处理程序必须如下所示:

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()
)都在对象内完成。