Ubuntu18.04编译C++代码遇boost::asio::strand模板参数缺失错误求助
Boost 1.64.0中boost::asio::strand编译错误的解决方案
问题场景
在Ubuntu 18.04系统下,使用CMake编译基于Boost 1.64.0的C++代码时,出现boost::asio::strand相关编译错误。
出错代码片段
#pragma once // This file and the associated implementation has been placed in the public domain, waiving all copyright. No restrictions are placed on its use. #include "Common/Defines.h" #include <deque> #include <mutex> #include <future> #include "Network/BtIOService.h" namespace osuCrypto { class WinNetIOService; class ChannelBuffer; class BtSocket { public: BtSocket(BtIOService& ios); boost::asio::ip::tcp::socket mHandle; boost::asio::strand mSendStrand, mRecvStrand; //Error line std::deque<BoostIOOperation> mSendQueue, mRecvQueue; bool mStopped; std::atomic<u64> mOutstandingSendData, mMaxOutstandingSendData, mTotalSentData, mTotalRecvData; }; }
错误信息
In file included from /root/project/MultipartyPSI/MultipartyPSI/cryptoTools/Network/BtAcceptor.h:8:0, from /root/project/MultipartyPSI/MultipartyPSI/cryptoTools/Network/BtEndpoint.h:5, from /root/project/MultipartyPSI/MultipartyPSI/frontend/OtBinMain.cpp:1: /root/project/MultipartyPSI/MultipartyPSI/cryptoTools/Network/BtSocket.h:76:9: error: invalid use of template-name ‘boost::asio::strand’ without an argument list boost::asio::strand mSendStrand, mRecvStrand; ^~~~~ compilation terminated due to -Wfatal-errors.
解决方案
错误核心原因是Boost 1.64.0中的boost::asio::strand是模板类,不能直接作为类型声明变量,必须指定对应的模板参数(执行器类型)。以下两种方法均可解决:
方法一:使用io_service的嵌套strand类型
修改BtSocket类中的strand声明,替换为boost::asio::io_service::strand:
boost::asio::ip::tcp::socket mHandle; boost::asio::io_service::strand mSendStrand, mRecvStrand; // 修改后的声明
然后在构造函数中,通过BtIOService提供的io_service实例初始化strand(假设BtIOService有getIoService()方法返回boost::asio::io_service&):
BtSocket::BtSocket(BtIOService& ios) : mHandle(ios.getIoService()), mSendStrand(ios.getIoService()), mRecvStrand(ios.getIoService()), mStopped(false) { // 初始化原子变量 mOutstandingSendData = 0; mMaxOutstandingSendData = 0; mTotalSentData = 0; mTotalRecvData = 0; }
方法二:显式指定strand的模板参数
直接为boost::asio::strand指定模板参数boost::asio::io_service::executor_type:
boost::asio::ip::tcp::socket mHandle; boost::asio::strand<boost::asio::io_service::executor_type> mSendStrand, mRecvStrand; // 修改后的声明
构造函数的初始化逻辑和方法一完全一致,同样需要通过io_service实例来构造strand对象。
内容的提问来源于stack exchange,提问作者kit tom
相关产品推荐
相关产品推荐

