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

将std::make_unique<派生类>赋值给unique_ptr<基类>失败的解决方法

问题:unique_ptr多态赋值匹配错误

报错信息

error: no match for ‘operator=’ (operand types are ‘std::unique_ptr<srsran::test_mode_buffer_size>’ and 
‘std::_MakeUniq<srsran::static_test_mode>::__single_object’ 
{aka ‘std::unique_ptr<srsran::static_test_mode, std::default_delete<srsran::static_test_mode> >’})
  533 |     buffer_size_container = std::make_unique<static_test_mode>();

相关代码

派生类与基类定义

class static_test_mode : public test_mode_buffer_size {
public:
  static_test_mode() {}
  ~static_test_mode() {}
  unsigned get_buffer_size() override {
    return TEST_UE_DL_BUFFER_STATE_UPDATE_SIZE;
  }
};

class range_test_mode : public test_mode_buffer_size {
public:
  range_test_mode(srs_du::du_test_config::test_ue_config _test_ue):
  test_ue(_test_ue), interval_counter(0){
    current = test_ue.min_buffer_size;
  }
  ~range_test_mode() {}
  unsigned get_buffer_size() override {
    ++interval_counter;
    if(interval_counter == test_ue.buffer_interval && 
      current + test_ue.buffer_step <= test_ue.max_buffer_size){
      current += test_ue.buffer_step;
    }
    return current;
  }
private:
  srs_du::du_test_config::test_ue_config test_ue;
  unsigned interval_counter,current;
};
// TODO: trace mode

class test_mode_buffer_size{
public:
  virtual ~test_mode_buffer_size() = default;
  virtual unsigned get_buffer_size() = 0;
};

构造器代码

class mac_test_mode_adapter{
  //other members
  std::unique_ptr<test_mode_buffer_size> buffer_size_container;
}

mac_test_mode_adapter::mac_test_mode_adapter(const srs_du::du_test_config::test_ue_config& test_ue_cfg_, mac_result_notifier& phy_notifier_) :
  test_ue(test_ue_cfg_),
  phy_notifier(std::make_unique<phy_test_mode_adapter>(phy_notifier_)),
  ue_info_mgr(test_ue.rnti, test_ue.nof_ues)
{
  //fmt::print("test_ue.buffer_size={}\n",test_ue.buffer_size);
  if(test_ue.working_mode == "static"){
    buffer_size_container = std::make_unique<static_test_mode>();
  }
  else if (test_ue.working_mode == "range"){
    buffer_size_container = std::make_unique<range_test_mode>(test_ue);
  }
  // TODO: trace mode
}

解决方案

错误根源是类声明顺序错误:你先定义了派生类static_test_mode、range_test_mode,再定义基类test_mode_buffer_size。编译器处理派生类时,基类还属于不完全类型,无法确认派生类与基类的继承关系,导致std::unique_ptr<test_mode_buffer_size>无法接受派生类的unique_ptr实例赋值。

修复步骤:

  1. 将基类test_mode_buffer_size的定义移到所有派生类的前面,确保编译器在处理派生类时已经完整知晓基类的结构。
  2. 保持基类的虚析构函数和纯虚函数声明不变(你的代码中这部分是正确的,无需修改)。

修改后的代码结构示例:

// 先定义基类
class test_mode_buffer_size{
public:
  virtual ~test_mode_buffer_size() = default;
  virtual unsigned get_buffer_size() = 0;
};

// 再定义派生类
class static_test_mode : public test_mode_buffer_size {
public:
  static_test_mode() {}
  ~static_test_mode() {}
  unsigned get_buffer_size() override {
    return TEST_UE_DL_BUFFER_STATE_UPDATE_SIZE;
  }
};

class range_test_mode : public test_mode_buffer_size {
public:
  range_test_mode(srs_du::du_test_config::test_ue_config _test_ue):
  test_ue(_test_ue), interval_counter(0){
    current = test_ue.min_buffer_size;
  }
  ~range_test_mode() {}
  unsigned get_buffer_size() override {
    ++interval_counter;
    if(interval_counter == test_ue.buffer_interval && 
      current + test_ue.buffer_step <= test_ue.max_buffer_size){
      current += test_ue.buffer_step;
    }
    return current;
  }
private:
  srs_du::du_test_config::test_ue_config test_ue;
  unsigned interval_counter,current;
};
// TODO: trace mode

这样修改后,编译器能正确识别派生类与基类的继承关系,std::unique_ptr的赋值操作就能正常进行,多态也能正确工作。

内容的提问来源于stack exchange,提问作者ToumaKazusa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:20:27