如何在避免使用new关键字的同时解决“error: no viable overloaded '='”编译错误
解决方案:用构造函数初始化列表+辅助函数实现无指针构造
你的问题核心在于两个关键点:LightweightNeuralNetwork既没有默认构造函数,又显式禁用了赋值运算符,这导致你没法先默认创建对象再赋值。要解决这个问题,我们可以利用构造函数初始化列表,配合一个辅助函数来提前完成文件读取和配置解析,直接初始化实体成员。
步骤1:修改头文件的成员定义
首先把指针类型的成员改成实体对象:
// TNeuralNetworkLWTNN.h 的 private 部分 private: lwt::LightweightNeuralNetwork lwtnn_neural; // 移除指针
步骤2:用辅助函数封装构造逻辑
因为需要先读取文件解析配置才能构造LightweightNeuralNetwork,我们可以写一个静态辅助函数来完成这些前置操作,返回一个构造好的LightweightNeuralNetwork对象:
// TNeuralNetworkLWTNN.cxx 中添加静态辅助函数 static lwt::LightweightNeuralNetwork build_lwtnn_network(const std::string& inputFile) { std::ifstream input(inputFile); std::stringstream sin; sin << input.rdbuf(); input.close(); lwt::JSONConfig config = lwt::parse_json(sin); // 直接构造并返回对象 return lwt::LightweightNeuralNetwork(config.inputs, config.layers, config.outputs); }
步骤3:在构造函数初始化列表中初始化成员
把原来构造函数里的赋值逻辑换成初始化列表,调用上面的辅助函数来直接初始化lwtnn_neural:
// 修改后的构造函数 TNeuralNetworkLWTNN::TNeuralNetworkLWTNN(std::string inputFile) : lwtnn_neural(build_lwtnn_network(inputFile)) { // 这里不需要任何额外代码,初始化列表已经完成对象构造 }
步骤4:简化析构函数和compute方法
- 析构函数可以直接删除或者设为默认,因为实体对象会由编译器自动清理,不需要手动
delete:
TNeuralNetworkLWTNN::~TNeuralNetworkLWTNN() = default;
compute方法里把->换成.即可:
TNeuralNetworkLWTNN::NetworkOutputs TNeuralNetworkLWTNN::compute(TNeuralNetworkLWTNN::NetworkInputs inputs) { return lwtnn_neural.compute(inputs); }
为什么这样能解决问题?
- 避免默认构造需求:初始化列表会直接调用
LightweightNeuralNetwork的带参构造函数来创建成员对象,跳过了编译器尝试调用默认构造的步骤,解决了第一个编译错误。 - 避开禁用的赋值运算符:我们没有使用赋值操作,而是直接在初始化阶段完成对象构造,完全绕开了被
= delete的赋值运算符,解决了第二个编译错误。 - 兼顾前置逻辑:静态辅助函数把文件读取、配置解析的逻辑封装起来,让我们能在初始化列表中完成所有前置操作,满足“需要先读取文件才能构造”的要求。
内容的提问来源于stack exchange,提问作者Clumsy cat
相关产品推荐
相关产品推荐

