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

VS2019编译boost::asio::async_completion对象声明失败求解决

Windows VS2019+Boost 1.81编译失败问题解决

问题场景

以下代码在Linux Ubuntu 20.04环境可正常编译,但在Windows VS2019搭配Boost 1.81时编译失败,主函数仅用于验证编译:

#include <boost/asio/spawn.hpp>

void wait(boost::asio::yield_context yield)
{
        boost::asio::async_completion<boost::asio::yield_context, void(boost::system::error_code)> init(yield);
}

int main()
{
        return 0;
}

编译错误信息

错误 C4430: 缺少类型说明符 - 假定为int。注意: C++不支持默认int
错误 C3646: 'completion_handler_type': 未知重写说明符
错误 C2039: 'completion_handler_type': 不是'boost::asio::async_result<boost::asio::basic_yield_contextboost::asio::any_io_executor,void(boost::system::error_code)>'的成员

原因分析

VS2019的C++编译器对模板参数推导的逻辑与GCC(Ubuntu环境使用的编译器)存在差异,当直接将yield_context作为async_completion的第一个模板参数时,VS2019无法正确解析async_result关联的内部类型,导致编译报错。而GCC在这类模板类型推导上的兼容性更好,能够正确识别所需类型。

解决方案

方式一:显式推导完成处理类型

通过async_result获取yield_context对应的完成处理类型,再传递给async_completion:

#include <boost/asio/spawn.hpp>
#include <boost/asio/async_result.hpp>

void wait(boost::asio::yield_context yield)
{
    using completion_handler_type = typename boost::asio::async_result<boost::asio::yield_context, void(boost::system::error_code)>::completion_handler_type;
    boost::asio::async_completion<completion_handler_type, void(boost::system::error_code)> init(yield);
}

int main()
{
    return 0;
}

方式二:利用decltype自动推导模板参数

通过decltype(yield)让编译器自动识别正确的类型,避免手动指定的兼容性问题:

#include <boost/asio/spawn.hpp>

void wait(boost::asio::yield_context yield)
{
    boost::asio::async_completion<decltype(yield), void(boost::system::error_code)> init(yield);
}

int main()
{
    return 0;
}

方式三:使用简化构造语法

借助async_completion的重载构造函数,直接传入yield和签名占位符,让编译器自动推导所有模板参数:

#include <boost/asio/spawn.hpp>

void wait(boost::asio::yield_context yield)
{
    boost::asio::async_completion init(yield, void(boost::system::error_code)());
}

int main()
{
    return 0;
}

内容的提问来源于stack exchange,提问作者JimmyY

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 13:43:24