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
相关产品推荐
相关产品推荐

