Boost.Asio::Spawn编译错误:C2039 'type'非result_of成员
解决Boost Asio协程中
boost::asio::result_of的C2039编译错误 问题背景
- 基于Boost 1.80官方WebSocket客户端协程示例改写代码,将原示例的
main函数逻辑迁移到ClientSession类的StartSession成员函数中,通过net::spawn调用do_session协程函数,仅调整do_session参数,函数主体未改动 - 编译环境:C++17、Boost 1.8.0、Windows 11 x64
- 触发编译错误:
code C2039: 'type': is not a member of 'boost::asio::result_of<Function (boost::asio::basic_yield_context<Executor>)>'
错误原因
C17标准已弃用std::result_of,Boost Asio的boost::asio::result_of在C17编译模式下存在兼容性问题。当直接将类成员函数指针传递给net::spawn时,成员函数的隐式this指针会导致result_of无法正确推导函数的返回类型,从而触发该错误。
解决方案
方案1:用Lambda封装成员函数调用(推荐)
将成员函数调用封装在lambda中,通过捕获this消除隐式this指针对类型推导的影响,net::spawn可正确识别lambda的可调用签名。
示例代码:
class ClientSession { public: void StartSession(boost::asio::io_context& ioc) { // 用lambda封装do_session调用 boost::asio::spawn(ioc, [this](boost::asio::yield_context yield) { this->do_session(yield); }); } private: void do_session(boost::asio::yield_context yield) { // 原示例中的协程逻辑 } };
方案2:显式指定协程函数的返回类型
在net::spawn调用中通过模板参数明确指定函数的返回类型,跳过result_of的自动推导流程。
示例代码:
void ClientSession::StartSession(boost::asio::io_context& ioc) { // 显式指定返回类型为void,参数为yield_context boost::asio::spawn<void(boost::asio::yield_context)>(ioc, &ClientSession::do_session, this); }
方案3:将成员函数改为静态函数
如果do_session逻辑不依赖类实例的非静态成员,可将其改为静态函数,直接传递函数指针给net::spawn。
示例代码:
class ClientSession { public: void StartSession(boost::asio::io_context& ioc) { boost::asio::spawn(ioc, &ClientSession::do_session); } private: static void do_session(boost::asio::yield_context yield) { // 静态函数逻辑 } };
内容的提问来源于stack exchange,提问作者bear
相关产品推荐
相关产品推荐

