J'implémente la méthode suivante pour supprimer un élément à partir d'une table associative (map
) avec map::erase()
:Lors de l'utilisation de map :: erase() "erreur: en passant 'const ***' comme 'this' argument de '***' supprime les qualificatifs [-fpermissive]" reporté
//Method in gestion.cpp
void Gestion::EliminateObject(string nomobjetg) const{
auto it = objectname.find(nameobjectg);
if (it == objectname.end())
cout << "Object not found!" << endl;
else
objectname.erase(it); //The error is reported in this line
}
Dans l'en-tête j'ai défini ce qui suit:
//gestion.h
#include "objects.h"
#include <list>
#include <iostream>
#include <string>
#include <memory>
#include <map>
using namespace std;
typedef std::shared_ptr<Objects> ObjPtr;
typedef map<string, ObjPtr> Objectmap;
class Gestion
{
private:
Objectmap objectname;
public:
Gestion(Objectmap objectname, Groupmap groupname);
virtual ~Gestion() {}
virtual void EliminateObject(string nameobjectg) const;
};
Lorsque ObjPtr
est un pointeur virtuel d'objets de type Objects
.
Quand je compile je reçois cette erreur:
error: passing ‘const Objectmap {aka const std::map<std::basic_string<char>, std::shared_ptr<Objects> >}’ as ‘this’ argument of ‘std::map<_Key, _Tp, _Compare, _Alloc>::iterator std::map<_Key, _Tp, _Compare, _Alloc>::erase(std::map<_Key, _Tp, _Compare, _Alloc>::const_iterator) [with _Key = std::basic_string<char>; _Tp = std::shared_ptr<Objects>; _Compare = std::less<std::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::shared_ptr<Objects> > >; std::map<_Key, _Tp, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::shared_ptr<Objects> > >; std::map<_Key, _Tp, _Compare, _Alloc>::const_iterator = std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char>, std::shared_ptr<Objects> > >]’ discards qualifiers [-fpermissive]
objectname.erase(it);
Pourquoi cette ligne signalez cette erreur? J'ai vu d'autres messages avec ce type d'erreur mais dans ces cas, la cause première du problème est liée à la façon dont la méthode est déclarée (const
). Dans ce cas, la méthode impliquée dans le problème est erase
et je ne peux pas le modifier.
non apparentés, mais vous voudrez probablement passer 'nomobjetg' par const référence plutôt que par valeur. C'est 'vide Gestion :: EliminateObject (const string & nomobjetg)'. Si c'est une chaîne std ::, elle fera une copie de chaîne inutile. –