官方asio::co_spawn示例编译失败,如何结合io_context使用?
Boost.Asio协程示例编译错误:io_context无法被co_spawn识别为有效执行器
问题现象
使用Boost.Asio 1.75的cpp17协程TS回显服务器示例代码时,调用co_spawn函数出现编译错误,编译器无法将io_context识别为有效执行器。
相关代码片段
co_spawn(io_context, listener(), detached);
环境信息
- Boost.Asio版本:1.75(独立Asio 1.24也存在该问题)
- 编译器:
cl.exe版本19.34.31937
编译器错误输出
C:\Users\...\include\boost\asio\impl\co_spawn.hpp(255,10): 错误 C2665: “boost::asio::any_io_executor::any_io_executor”: 没有重载函数可以转换所有参数类型 C:\Users\...\include\boost\asio\impl\any_io_executor.ipp(34,18): 消息: 可能是“boost::asio::any_io_executor::any_io_executor(std::nullptr_t) noexcept” C:\Users\...\include\boost\asio\impl\co_spawn.hpp(255,10): 消息: “boost::asio::any_io_executor::any_io_executor(std::nullptr_t) noexcept”: 无法将参数 1 从“const OtherExecutor”转换为“std::nullptr_t” 随附模板参数: [ OtherExecutor=boost::asio::io_context::executor_type ] C:\Users\...\include\boost\asio\impl\co_spawn.hpp(255,11): 消息: 没有可用的用户定义转换运算符来执行此转换,或者无法调用该运算符 C:\Users\...\include\boost\asio\any_io_executor.hpp(189,3): 消息: 或 “boost::asio::any_io_executor::any_io_executor(std::nothrow_t,Executor,constraint<std::conditional<!std::is_same<OtherAnyExecutor,boost::asio::any_io_executor>::value&&!std::is_base_of<boost::asio::execution::detail::any_executor_base,Executor>::value,boost::asio::execution::detail::is_valid_target_executor<Executor,boost::asio::any_io_executor::supportable_properties_type>,std::false_type>::type::value,int>::type) noexcept” C:\Users\...\include\boost\asio\impl\co_spawn.hpp(255,10): 消息: “boost::asio::any_io_executor::any_io_executor(std::nothrow_t,Executor,constraint<std::conditional<!std::is_same<OtherAnyExecutor,boost::asio::any_io_executor>::value&&!std::is_base_of<boost::asio::execution::detail::any_executor_base,Executor>::value,boost::asio::execution::detail::is_valid_target_executor<Executor,boost::asio::any_io_executor::supportable_properties_type>,std::false_type>::type::value,int>::type) noexcept”: 需要 3 个参数,但提供了 1 个 C:\Users\...\include\boost\asio\any_io_executor.hpp(167,3): 消息: 或 “boost::asio::any_io_executor::any_io_executor(Executor,constraint<std::conditional<!std::is_same<OtherAnyExecutor,boost::asio::any_io_executor>::value&&!std::is_base_of<boost::asio::execution::detail::any_executor_base,Executor>::value,boost::asio::execution::detail::is_valid_target_executor<Executor,boost::asio::any_io_executor::supportable_properties_type>,std::false_type>::type::value,int>::type)” C:\Users\...\include\boost\asio\impl\co_spawn.hpp(255,10): 消息: 无法特化函数模板“boost::asio::any_io_executor::any_io_executor(Executor,constraint<std::conditional<!std::is_same<OtherAnyExecutor,boost::asio::any_io_executor>::value&&!std::is_base_of<boost::asio::execution::detail::any_executor_base,Executor>::value,boost::asio::execution::detail::is_valid_target_executor<Executor,boost::asio::any_io_executor::supportable_properties_type>,std::false_type>::type::value,int>::type)” C:\Users\...\include\boost\asio\impl\co_spawn.hpp(255,10): 消息: 使用以下模板参数: C:\Users\...\include\boost\asio\impl\co_spawn.hpp(255,10): 消息: “Executor=OtherExecutor” C:\Users\...\include\boost\asio\any_io_executor.hpp(134,3): 消息: 或 “boost::asio::any_io_executor::any_io_executor(std::nothrow_t,OtherAnyExecutor,constraint<std::conditional<!std::is_same<OtherAnyExecutor,boost::asio::any_io_executor>::value&&std::is_base_of<boost::asio::execution::detail::any_executor_base,Executor>::value,boost::asio::execution::detail::supportable_properties<0,void (boost::asio::execution::context_as_t<boost::asio::execution_context &>,boost::asio::execution::detail::blocking::never_t<0>,boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0>>)>::is_valid_target<OtherAnyExecutor>,std::false_type>::type::value,int>::type) noexcept” C:\Users\...\include\boost\asio\impl\co_spawn.hpp(255,10): 消息: “boost::asio::any_io_executor::any_io_executor(std::nothrow_t,OtherAnyExecutor,constraint<std::conditional<!std::is_same<OtherAnyExecutor,boost::asio::any_io_executor>::value&&std::is_base_of<boost::asio::execution::detail::any_executor_base,Executor>::value,boost::asio::execution::detail::supportable_properties<0,void (boost::asio::execution::context_as_t<boost::asio::execution_context &>,boost::asio::execution::detail::blocking::never_t<0>,boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0>>)>::is_valid_target<OtherAnyExecutor>,std::false_type>::type::value,int>::type) noexcept”: 需要 3 个参数,但提供了 1 个 C:\Users\...\include\boost\asio\any_io_executor.hpp(110,3): 消息: 或 “boost::asio::any_io_executor::any_io_executor(OtherAnyExecutor,constraint<std::conditional<!std::is_same<OtherAnyExecutor,boost::asio::any_io_executor>::value&&std::is_base_of<boost::asio::execution::detail::any_executor_base,Executor>::value,boost::asio::execution::detail::supportable_properties<0,void (boost::asio::execution::context_as_t<boost::asio::execution_context &>,boost::asio::execution::detail::blocking::never_t<0>,boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0>>)>::is_valid_target<OtherAnyExecutor>,std::false_type>::type::value,int>::type)” C:\Users\...\include\boost\asio\impl\co_spawn.hpp(255,10): 消息: 无法特化函数模板“boost::asio::any_io_executor::any_io_executor(OtherAnyExecutor,constraint<std::conditional<!std::is_same<OtherAnyExecutor,boost::asio::any_io_executor>::value&&std::is_base_of<boost::asio::execution::detail::any_executor_base,Executor>::value,boost::asio::execution::detail::supportable_properties<0,void (boost::asio::execution::context_as_t<boost::asio::execution_context &>,boost::asio::execution::detail::blocking::never_t<0>,boost::asio::execution::prefer_only<boost::asio::execution::detail::blocking::possibly_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::tracked_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::outstanding_work::untracked_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::fork_t<0>>,boost::asio::execution::prefer_only<boost::asio::execution::detail::relationship::continuation_t<0>>)>::is_valid_target<OtherAnyExecutor>,std::false_type>::type::value,int>::type)” C:\Users\...\include\boost\asio\impl\co_spawn.hpp(255,10): 消息: 使用以下模板参数: C:\Users\...\include\boost\asio\impl\co_spawn.hpp(255,10): 消息: “OtherAnyExecutor=OtherExecutor” C:\Users\...\include\boost\asio\impl\co_spawn.hpp(255,10): 消息: 尝试匹配参数列表“(const OtherExecutor)”时出错 随附模板参数: [ OtherExecutor=boost::asio::io_context::executor_type ] C:\Users\...\include\boost\asio\impl\co_spawn.hpp(378,1): 消息: 参见正在编译的函数模板实例化“boost::asio::detail::initiate_co_spawn<boost::asio::any_io_executor>::initiate_co_spawn<Executor>(const OtherExecutor &)” 随附模板参数: [ Executor=boost::asio::io_context::executor_type, OtherExecutor=boost::asio::io_context::executor_type ] C:\Users\...\include\boost\asio\impl\co_spawn.hpp(375,3): 消息: 参见正在编译的函数模板实例化“boost::asio::detail::initiate_co_spawn<boost::asio::any_io_executor>::initiate_co_spawn<Executor>(const OtherExecutor &)” 随附模板参数: [ Executor=boost::asio::io_context::executor_type, OtherExecutor=boost::asio::io_context::executor_type ] C:\Users\...\Main\asio_test\asio_test.cpp(298,20): 消息: 参见正在编译的函数模板实例化“void boost::asio::co_spawn<boost::asio::io_context::executor_type,main::<lambda_,const boost::asio::detached_t&>(const Executor &,F &&,CompletionToken,int)” 随附模板参数: [ Executor=boost::asio::io_context::executor_type, F=main::<lambda_, CompletionToken=const boost::asio::detached_t & ]
内容的提问来源于stack exchange,提问作者Gregory Bull
相关产品推荐
相关产品推荐

