Boost 1.73.0 Asio调用get_executor时编译错误求助
修复Boost.Asio TCP服务器的编译错误
针对你的Ubuntu 20.04LTS + Boost 1.73环境,代码存在两个核心问题,以下是修复方案:
修复后的完整代码
#include "server.h" #include <iostream> // 假设server.h中已包含: // #include <boost/asio.hpp> // using tcp = boost::asio::ip::tcp; Server::Server(boost::asio::io_context& io_context, unsigned short port) : acceptor_(io_context, tcp::endpoint(tcp::v4(), port)), io_context_(io_context) { // 保存io_context引用,方便后续使用 start_accept(); } void Server::start_accept() { // 方案1:用io_context直接构造socket(直观易读) tcp::socket socket(io_context_); acceptor_.async_accept(socket, [this](boost::system::error_code ec) { // 匹配async_accept(socket, handler)的签名 handle_accept(std::move(socket), ec); } ); // 方案2:改用无需提前创建socket的async_accept重载(更简洁) /* acceptor_.async_accept( [this](boost::system::error_code ec, tcp::socket socket) { handle_accept(std::move(socket), ec); } ); */ } void Server::handle_accept(tcp::socket socket, const boost::system::error_code& error) { if (!error) { std::cout << "New connection accepted." << std::endl; } else { std::cerr << "Error on accept: " << error.message() << std::endl; } start_accept(); }
错误原因解析
1. Socket构造逻辑错误
原代码tcp::socket socket(acceptor_.get_executor().context());的问题:
acceptor_.get_executor().context()返回的是boost::asio::execution_context对象,而Boost.Asio 1.73中该类没有get_executor()方法,这是你看到的核心编译错误根源。- 正确做法:直接用Server构造时传入的
io_context&构造socket,或用acceptor的executor构造:tcp::socket socket(acceptor_.get_executor());。
2. Async_Accept Handler签名不匹配
原代码中handler签名是(boost::system::error_code ec, tcp::socket socket),但你调用的acceptor_.async_accept(socket, handler)重载,要求handler签名为void(error_code)——因为socket已提前创建传入,Asio不会再传递socket参数。
- 若要使用带socket参数的handler,需改用无需提前创建socket的async_accept重载(即方案2的代码),此时Asio会自动创建socket并通过handler传递。
编译命令补充
编译时需链接Boost系统和线程库:
g++ -I include -std=c++17 -Wall src/server.cpp -o server -lboost_system -lboost_thread
内容的提问来源于stack exchange,提问作者truing Matthews
相关产品推荐
相关产品推荐

