VS编译C++ aegis库示例时xutility报C2664 asio参数转换错误
错误诱因
该编译错误是依赖库版本不兼容导致的:
- 你本地使用了最新的asio开发版(
asio-master分支),而aegis库依赖的websocketpp版本较旧,二者API不匹配。 - 从错误栈可以定位到问题源头在
websocketpp/transport/asio/security/none.hpp第172行:老版websocketpp构造tcp::socket时,传入了std::reference_wrapper<asio::io_context>类型的右值作为参数,而新版asio的asio::ip::tcp::socket构造函数要求第一个参数是asio::io_context的左值引用,std::reference_wrapper右值无法绑定到非const左值引用参数,最终触发C2664报错。
修复方案
你可以任选以下一种方案解决:
- 降级asio版本
卸载当前的asio-master开发版,改用asio 1.22.x及更早的稳定版本,旧版本asio的socket构造逻辑兼容websocketpp的传参方式。 - 修改websocketpp源码
打开报错的websocketpp/transport/asio/security/none.hpp文件,定位到第172行构造socket的代码,原代码类似:
修改为调用socket_ = std::make_shared<asio::ip::tcp::socket>(std::ref(io_context));.get()取出reference_wrapper包装的实际io_context左值:
同目录下socket_ = std::make_shared<asio::ip::tcp::socket>(std::ref(io_context).get());tls.hpp文件如果存在相同的socket构造逻辑,也做同样修改即可。 - 优先使用aegis自带的asio
如果aegis库本身捆绑了兼容版本的asio,调整你项目的头文件包含优先级,将aegis附带的asio路径放到你本地asio-master路径之前,让编译器优先使用aegis自带的asio头文件。
内容的提问来源于stack exchange,提问作者geraldsing34
相关产品推荐
相关产品推荐

