不能在非Boost版本的Asio中使用asio :: placeholders :: error

rui*_*eco 8 c++ boost boost-asio c++11

我正在尝试在项目中使用非Boost版本的Asio.我正在写一个回调stream_protocol::acceptor::async_accept.签名需要asio::placeholders::error通过但是当我这样做时,我收到以下错误:

error: no member named 'error' in namespace 'asio::placeholders'

在源代码之后,我可以看到错误,但是类型undefined,这对我来说是新的.我错过了什么吗?我应该对图书馆进行某种预处理吗?

Tan*_*ury 18

简而言之,使用std::placeholders::_1而不是asio::placeholders:error.


使用Boost.Bind时,Asio仅支持方便的占位符变量.该error占位符的文件中指出:

参数占位符,用于boost::bind()...

std::bind()用于创建处理程序时,需要使用std::bind占位符.该async_accept()操作接受满足AcceptHandler类型要求的处理程序:

接受处理程序必须满足处理程序的要求.h接受处理程序类的值应该在表达式中正确工作h(ec),其中ec是类型的左值const error_code.

当创建一个std::bind()函数作为AcceptHandler时,如果想要获取error_code参数,那么使用std::placeholders::_1:

void handle_accept(const std::error_code&);

acceptor.async_accept(server_socket, std::bind(&handle_accept,
  std::placeholders::_1 /* error_code */));
Run Code Online (Sandbox Code Playgroud)

这是一个完整的最小示例演示使用std::bind().请注意,coliru似乎没有可用的Asio独立版本,但该示例应该足够:

#include <iostream>
#include <functional>

#include <boost/asio.hpp>

void handle_accept(const boost::system::error_code& error_code)
{
  std::cout << "handle_accept: " << error_code.message() << std::endl;
}

void noop() {}

int main()
{
  using boost::asio::ip::tcp;
  boost::asio::io_service io_service;

  // Create all I/O objects.
  tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 0));
  tcp::socket server_socket(io_service);
  tcp::socket client_socket(io_service);

  // Connect client and server sockets.
  acceptor.async_accept(server_socket, std::bind(&handle_accept,
    std::placeholders::_1 /* error_code */));
  client_socket.async_connect(acceptor.local_endpoint(), std::bind(&noop));
  io_service.run();
}
Run Code Online (Sandbox Code Playgroud)

输出:

handle_accept: Success
Run Code Online (Sandbox Code Playgroud)

可选地,如果希望更详细一些,则可以使用命名占位符:

namespace asio_placeholders
{
  auto error = std::placeholders::_1;
}

// ...

acceptor.async_accept(server_socket, std::bind(&handle_accept,
  asio_placeholders::error));
Run Code Online (Sandbox Code Playgroud)

unspecified源代码中观察到的类型仅在生成文档时使用,如以下代码所示:

#if defined(GENERATING_DOCUMENTATION)

/// An argument placeholder, for use with boost::bind(), that corresponds to
/// the error argument of a handler for any of the asynchronous functions.
unspecified error;

// ...

#elseif
Run Code Online (Sandbox Code Playgroud)