2020年12月22日星期二

"invalid new-expression of abstract class type" problem with unique_ptr?

I am developing a class system to be able to compare data but but there are some error due to unique_ptr that i don't understand.

I believe this is mainly because of the pure virtual clone method of "Valeur"

Valeur.hh :

#pragma once  #include <map>  #include <list>  #include <string>  #include <memory>    namespace common {        class Valeur {      public:          //virtual bool operator==(Valeur const& v) const = 0;          virtual std::unique_ptr<Valeur> clone() const = 0;      };        class Objet : public Valeur{      private:          std::map<std::string,std::unique_ptr<Valeur>> _valeurs;          bool contientValeur(std::string key,Valeur const& Valeur)const;      public:          Objet() = default;          Objet( Objet const& o);          void ajouterValeur(std::string key,std::unique_ptr<Valeur> v);          std::unique_ptr<Valeur> clone () const override;      };           class Boolleen : public Valeur { //problem      private:          bool _b;      public:          Boolleen (bool const& b);          std::unique_ptr<Valeur> clone () const override = 0;      };        class Null : public Valeur { // problem      public :                   std::unique_ptr<Valeur> clone () const override;      };        }  

Valeur.cc: the error says : "invalid new-expression of abstract class type' common :: Boolleen "
however none of the classes are abstract

#include "Valeur.hh"  using namespace common;  bool Objet::contientValeur(std::string key, const Valeur &v) const {      auto cherch = _valeurs.find(key);      if(cherch == _valeurs.end()) return false;      else if (cherch->second->operator==(v)) return true;      return false;  }    Objet::Objet(const Objet &o)  {      for ( auto const& e : o._valeurs)      {          _valeurs.clear();         _valeurs.insert(std::pair<std::string,std::unique_ptr<Valeur>>(e.first,e.second->clone()));        }  }    void Objet::ajouterValeur(std::string key,std::unique_ptr<Valeur> v)  {      auto cherch = _valeurs.find(key);      if(cherch == _valeurs.end()) {          _valeurs[key] = std::move(v);      }      else return throw "Erreur : ajout de clé multiple";  }    std::unique_ptr<Valeur> Objet::clone() const  {      return std::make_unique<Objet>(*this);  }  Boolleen::Boolleen(const bool &b) : _b(b) {}    std::unique_ptr<Valeur> Boolleen::clone() const  {      return std::make_unique<Boolleen>(*this);  }    std::unique_ptr<Valeur> Null::clone() const  {      return std::make_unique<Null>(*this);  }  

error :

invalid new-expression of abstract class type 'common::Boolleen'                          unique_ptr.h 857  
https://stackoverflow.com/questions/65417666/invalid-new-expression-of-abstract-class-type-problem-with-unique-ptr December 23, 2020 at 08:39AM

没有评论:

发表评论