You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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对象,同时调整解析结果的类型:

  1. 移除tcp::resolver::query的实例化代码
  2. 用auto自动推导解析结果类型(或显式声明为tcp::resolver::results_type)
  3. 保持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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 06:10:53