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

如何在避免使用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);
}

为什么这样能解决问题?

  1. 避免默认构造需求:初始化列表会直接调用LightweightNeuralNetwork的带参构造函数来创建成员对象,跳过了编译器尝试调用默认构造的步骤,解决了第一个编译错误。
  2. 避开禁用的赋值运算符:我们没有使用赋值操作,而是直接在初始化阶段完成对象构造,完全绕开了被= delete的赋值运算符,解决了第二个编译错误。
  3. 兼顾前置逻辑:静态辅助函数把文件读取、配置解析的逻辑封装起来,让我们能在初始化列表中完成所有前置操作,满足“需要先读取文件才能构造”的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:02:38