VS2022 17.6+Boost.ASIO1.89+C++20编译报错C3546求规避方案
解决VS2022 17.6下Boost.ASIO 1.89的co_composed.hpp编译错误
错误信息
asio\co_composed.hpp(162,33): error C3546: '...': there are no parameter packs available to expand asio\co_composed.hpp(163,2): message : see reference to class template instantiation 'asio::detail::co_composed_state_return<Executors,Handler,asio::detail::co_composed_returns<Signatures...>>' being compiled
问题原因
这是VS2022 17.6版本MSVC编译器的已知bug,在处理Boost.ASIO 1.89中co_composed.hpp文件的模板参数包展开逻辑时出现解析错误。
修复方案
修改asio\detail\co_composed.hpp文件中的co_composed_state_return结构体的无参complete()方法:
原出错代码片段
void complete() { this->complete_impl(static_cast<Returns*>(nullptr), ...); }
修改后的代码片段
void complete() { this->complete_impl(static_cast<Returns*>(nullptr)); }
若需要更严谨的模板上下文匹配,也可以使用以下部分特化版本替换原通用模板:
template <typename Executors, typename Handler, typename... Signatures> struct co_composed_state_return<Executors, Handler, co_composed_returns<Signatures...>> : co_composed_state_base<Executors, Handler> { using co_composed_state_base<Executors, Handler>::co_composed_state_base; template <typename... Args> void complete(Args&&... args) { this->complete_impl(static_cast<co_composed_returns<Signatures...>*>(nullptr), std::forward<Args>(args)...); } void complete() { this->complete_impl(static_cast<co_composed_returns<Signatures...>*>(nullptr)); } };
示例代码
#include <iostream> #include <boost/asio.hpp> #include <boost/asio/co_spawn.hpp> #include <boost/asio/steady_timer.hpp> #include <boost/asio/use_awaitable.hpp> #include <chrono> int main() { boost::asio::io_context ctx; boost::asio::co_spawn(ctx, []() -> boost::asio::awaitable<void> { std::cout << "Enter\n"; boost::asio::steady_timer timer(co_await boost::asio::this_coro::executor, std::chrono::seconds(3)); co_await timer.async_wait(boost::asio::use_awaitable); std::cout << "Leave\n"; }, boost::asio::detached); ctx.run(); }
内容的提问来源于stack exchange,提问作者travaller2
相关产品推荐
相关产品推荐

