升级Boost.Asio从v1.73到v1.87遇C2039错误,求解决方案
解决Boost.Asio v1.87中
query不是basic_resolver成员的问题 这个错误是因为Boost.Asio从v1.73升级到v1.87时,basic_resolver::query类已被废弃并移除——API设计向C++20标准网络库对齐,简化了地址解析的调用方式。
修改方案
直接将主机名和服务/端口参数传入resolver.resolve()方法,无需显式创建query对象,同时调整解析结果的类型:
- 移除
tcp::resolver::query的实例化代码 - 用
auto自动推导解析结果类型(或显式声明为tcp::resolver::results_type) - 保持
boost::asio::connect的调用逻辑不变,传入新的解析结果
修改后的完整代码
#include <WinSock2.h> #include <iostream> #include <boost/asio.hpp> using boost::asio::ip::tcp; int main() { try { boost::asio::io_context io_service; tcp::resolver resolver(io_service); // 直接传入主机和端口,无需创建query对象 auto endpoints = resolver.resolve("localhost", "5002"); tcp::socket socket(io_service); boost::asio::connect(socket, endpoints); boost::system::error_code error; std::string stmp = "dummy data"; socket.send(boost::asio::buffer(stmp)); socket.shutdown(tcp::socket::shutdown_both); socket.close(); } catch (std::exception& e) { std::cout << e.what(); } }
额外说明
如果需要更复杂的解析配置(比如指定IP版本、服务类型等),可以使用resolver.resolve()的重载版本,例如:
// 指定仅解析IPv4地址 auto endpoints = resolver.resolve(boost::asio::ip::tcp::v4(), "localhost", "5002");
旧的resolver::iterator类型已被resolver::results_type替代,后者是一个范围类型,兼容C++11及以后的范围遍历语法,也可以像旧迭代器一样使用。
内容的提问来源于stack exchange,提问作者Banjolicious
相关产品推荐
相关产品推荐

