不能在非 Boost 版本的 Asio 中使用 asio::p laceholders::error
Can't use asio::placeholders::error in non-Boost version of Asio
我正试图在项目中使用非Boost版本的Asio。我正在给stream_protocol::acceptor::async_accept
写一个回调。签名需要传递asio::placeholders::error
,但当我这样做时,我会得到以下错误:
error: no member named 'error' in namespace 'asio::placeholders'
根据来源,我可以看到错误是存在的,但类型为undefined
,这对我来说是新的。我遗漏了什么吗?我应该对图书馆做一些预处理吗?
简而言之,使用std::placeholders::_1
而不是asio::placeholders:error
。
Asio在使用Boost.Bind时只支持方便的占位符变量。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 */));
下面是一个完整的使用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();
}
输出:
handle_accept: Success
可选地,如果希望更详细一点,那么可以使用命名占位符:
namespace asio_placeholders
{
auto error = std::placeholders::_1;
}
// ...
acceptor.async_accept(server_socket, std::bind(&handle_accept,
asio_placeholders::error));
源代码中观察到的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
- 理解boost::asio-async_read在无需读取内容时的行为
- "error: no matching function for call to"构造函数错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 提升 ASIO 无法识别计时器对象
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- websocketpp asio listen error
- 如何修复"fatal error: boost/asio.hpp: no such file or directory"?
- boost::asio error for UDP async_receive
- Boost asio error with Cygwin
- Boost asio, async_read error
- 不能在非 Boost 版本的 Asio 中使用 asio::p laceholders::error
- Boost asio & ssl & error code
- Boost asio Error 10054
- 提升 ASIO "A non-recoverable error occurred during database lookup"
- boost::asio::error类已不存在
- boost::asio async_send error
- Boost asio TCP IP asio class compile error with Visual Studio.错误:C2228:'.close'左侧必须具有类/结构/联合
- Boost asio set_option error
- Error when boost::asio::write