當(dāng)“錯(cuò)誤:沒(méi)有可行的重載“=”,如何避免新的?

我認(rèn)為我對(duì)物體是如何構(gòu)造的有一個(gè)根本性的誤解。

我有一些代碼目前正在使用new構(gòu)造對(duì)象,我被告知這是一種糟糕的做法。所以我想我可以去掉new關(guān)鍵字,用實(shí)際對(duì)象替換指針,然后刪除delete語(yǔ)句。不幸的是,當(dāng)我刪除新語(yǔ)句時(shí),得到error: no viable overloaded '='。我不明白為什么。

我想做的對(duì)象是一個(gè)LightWeightNeuralNetwork;見(jiàn)https://github.com/lwtnn/lwtnn/blob/master/include/lwtnn/LightweightNeuralNetwork.hh

編輯:UnholySheep在評(píng)論中指出,LightweightNeuralNetwork沒(méi)有默認(rèn)構(gòu)造函數(shù),這就是問(wèn)題的根源(當(dāng)類(lèi)TNeuralNetworkLWTNN初始化時(shí),它不知何故需要所有成員對(duì)象的默認(rèn)構(gòu)造函數(shù)?)。不幸的是,此處作為dupe提出的問(wèn)題解決方案將不起作用,因?yàn)樵摻鉀Q方案需要在初始值設(shè)定項(xiàng)列表中創(chuàng)建問(wèn)題對(duì)象。LightweightNeuralNetwork需要打開(kāi)一個(gè)文件才能創(chuàng)建。

我的代碼通常是作為更大框架的一部分編譯的,但這里有一個(gè)玩具模型來(lái)演示相關(guān)的位。

頭文件;

#ifndef VNEURALNETWORKLWTNN_H
#define VNEURALNETWORKLWTNN_H

#include <iostream>

// Becuase we have a field of type LightweightNeuralNetwork
#include "lwtnn/LightweightNeuralNetwork.hh"

class TNeuralNetworkLWTNN {
public:
  // same as for lwtnn
  typedef std::map<std::string, double> NetworkInputs;
  typedef std::map<std::string, double> NetworkOutputs;

  // constructor and destructor
  explicit TNeuralNetworkLWTNN(std::string inputFile);
  ~TNeuralNetworkLWTNN();

  // business end
  NetworkOutputs compute(NetworkInputs inputs);

private:
  // !!Change this to not be a pointer!!
  lwt::LightweightNeuralNetwork * lwtnn_neural;
};

#endif

和一個(gè)班級(jí);

#include "TNeuralNetworkLWTNN.h"
#include <fstream>
#include <sstream>

// LWTNN
#include "lwtnn/LightweightNeuralNetwork.hh"
#include "lwtnn/parse_json.hh"

TNeuralNetworkLWTNN::TNeuralNetworkLWTNN(std::string inputFile) {
  // The input file is read into a stringstream
  std::ifstream input(inputFile);
  std::stringstream sin;
  sin << input.rdbuf();
  input.close();
  // build the graph
  lwt::JSONConfig config = lwt::parse_json(sin);
  // !! I don't want to be using new !!
  // !! Change this to just use '=' !!
  // !! error: no viable overloaded '=' !!
  lwtnn_neural = new lwt::LightweightNeuralNetwork(config.inputs, config.layers,
                                                   config.outputs);
};

// I'd rather not need any code here
TNeuralNetworkLWTNN::~TNeuralNetworkLWTNN(){
  delete lwtnn_neural;
};

TNeuralNetworkLWTNN::NetworkOutputs
TNeuralNetworkLWTNN::compute(TNeuralNetworkLWTNN::NetworkInputs inputs) {
  // !! Change this to use . not -> !!
  TNeuralNetworkLWTNN::NetworkOutputs outputs =
      TNeuralNetworkLWTNN::lwtnn_neural->compute(inputs);
  return outputs;
};

很抱歉,沒(méi)有生成您可以編譯的內(nèi)容,在我正在編寫(xiě)的框架之外,我無(wú)法訪(fǎng)問(wèn)lwtnn庫(kù)。我希望我的錯(cuò)誤是很基本的。

完整的錯(cuò)誤消息(修改了一些路徑);

/path/to/repo/TNeuralNetworkLWTNN.cxx:9:22: error: constructor for 'TNeuralNetworkLWTNN' must explicitly initialize the member 'lwtnn_neural' which does not have a default constructor
TNeuralNetworkLWTNN::TNeuralNetworkLWTNN(std::string inputFile)
                     ^
/path/to/repo/TNeuralNetworkLWTNN.h:36:34: note: member is declared here
  lwt::LightweightNeuralNetwork  lwtnn_neural;
                                 ^
/path/to/library/lwtnn/LightweightNeuralNetwork.hh:41:9: note: 'lwt::LightweightNeuralNetwork' declared here
  class LightweightNeuralNetwork
        ^
/path/to/repo/TNeuralNetworkLWTNN.cxx:18:16: error: no viable overloaded '='
  lwtnn_neural = lwt::LightweightNeuralNetwork(config.inputs, config.layers,
  ~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/path/to/releases/lwtnn/2.11.1-2ee64/x86_64-centos7-gcc11-opt/include/lwtnn/LightweightNeuralNetwork.hh:52:31: note: candidate function not viable: expects an lvalue for 1st argument
    LightweightNeuralNetwork& operator=(LightweightNeuralNetwork&) = delete;
                              ^
2 errors generated.
make[2]: *** [CMakeFiles/GenericTest.dir/TNeuralNetworkLWTNN.cxx.o] Error 1
make[2]: *** Waiting for unfinished jobs....
make[1]: *** [CMakeFiles/GenericTest.dir/all] Error 2
make: *** [all] Error 2

? 最佳回答:

問(wèn)題是lwt::LightweightNeuralNetwork是不可移動(dòng)的,正如@n.1.8e9-where's-my-sharem.所指出的,這似乎是庫(kù)中的一個(gè)bug,因?yàn)樗坪鯖](méi)有任何理由不可移動(dòng)。

如果您不想或由于某種原因無(wú)法自己對(duì)庫(kù)進(jìn)行更改(并且等待它被修復(fù)是一種不可接受的延遲),那么您可以簡(jiǎn)單地將lwt::LightweightNeuralNetwork * lwtnn_neural;替換為std::unique_ptr<lwt::LightweightNeuralNetwork> lwtnn_neural;,并在構(gòu)造函數(shù)中將lwtnn_neural = new lwt::LightweightNeuralNetwork(config.inputs, config.layers, config.outputs);替換成lwtnn_neural = std::make_unique<lwt::LightweightNeuralNetwork>(config.inputs, config.layers, config.outputs);


然而,添加移動(dòng)構(gòu)造和分配非常簡(jiǎn)單,因此您可以考慮自己進(jìn)行,例如:

LightweightNeuralNetwork(LightweightNeuralNetwork&& other) noexcept : 
  m_impl(std::move(other.m_impl) {}

LightweightNeuralNetwork& operator=(LightweightNeuralNetwork&& other) noexcept {
  if (this != &other) {
    m_impl = std::move(other.m_impl);
  }
  return *this;
}

然后你可以有一個(gè)non-pointer成員和一個(gè)額外的函數(shù)來(lái)初始化成員初始值設(shè)定項(xiàng)列表中的lwt::LightweightNeuralNetwork,例如:

// Moved all the logic from the constructor body into separate function
static lwt::LightweightNeuralNetwork createNetwork(const std::string& inputFile) {
  // The input file is read into a stringstream
  std::ifstream input(inputFile);
  std::stringstream sin;
  sin << input.rdbuf();
  input.close();
  // build the graph
  lwt::JSONConfig config = lwt::parse_json(sin);
  return lwt::LightweightNeuralNetwork(config.inputs, config.layers, config.outputs);
}

TNeuralNetworkLWTNN::TNeuralNetworkLWTNN(std::string inputFile) : 
  lwtnn_neural(createNetwork(inputFile)) // function used to create object for member
  {}
主站蜘蛛池模板: 日韩精品一区二区三区不卡| 3d动漫精品啪啪一区二区中| 日韩免费一区二区三区| 精品国产日韩一区三区| 濑亚美莉在线视频一区| 性色AV一区二区三区| 夜夜精品视频一区二区| 奇米精品视频一区二区三区| 国产一区二区三区不卡在线观看| 久久一区不卡中文字幕| 激情爆乳一区二区三区| 在线免费视频一区二区| 无码精品人妻一区二区三区漫画 | 日韩有码一区二区| 国产在线步兵一区二区三区| 2021国产精品视频一区| 国产成人精品无码一区二区三区| 日本精品一区二区在线播放| 蜜桃无码一区二区三区| 精品无码一区二区三区爱欲九九| 红杏亚洲影院一区二区三区| 国产凸凹视频一区二区| 国产一区二区三区播放| 亚洲天堂一区二区三区四区| 亚洲国产精品无码第一区二区三区| 无码欧精品亚洲日韩一区夜夜嗨| 久久精品国产第一区二区| 日韩人妻无码一区二区三区久久99| 亚洲一区影音先锋色资源| 一区五十路在线中出| 日韩精品无码一区二区三区免费 | 中文字幕在线无码一区| 精彩视频一区二区| 日本中文字幕在线视频一区| 久99精品视频在线观看婷亚洲片国产一区一级在线 | 国产激情一区二区三区 | 国产免费私拍一区二区三区| 精彩视频一区二区| 亚洲电影一区二区| 无码国产亚洲日韩国精品视频一区二区三区| 一区二区三区亚洲|