将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实例赋值。
修复步骤:
- 将基类
test_mode_buffer_size的定义移到所有派生类的前面,确保编译器在处理派生类时已经完整知晓基类的结构。 - 保持基类的虚析构函数和纯虚函数声明不变(你的代码中这部分是正确的,无需修改)。
修改后的代码结构示例:
// 先定义基类 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
相关产品推荐
相关产品推荐

