You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 17:36:23