2016-02-27 1 views
0

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.

+0

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. –

Répondre

1

void Gestion::EliminateObject(string nomobjetg) const

Vous essayez de modifier objectname votre appel à objectname.erase(it), et une fonction const ne vous laissera pas le faire, à moins que objectname est mutable.

Supprimer const:

void Gestion::EliminateObject(string nomobjetg) 

ou

Faire objectname mutable

mutable Objectmap objectname; 
+0

merci! pour la première option suggérez-vous de changer 'const' par' * '? Pourquoi simplement éliminer 'const' ne résoudrait pas le problème? – Marco

+1

Le * était une faute de frappe, je l'ai réparé maintenant ... Oui, je voudrais simplement supprimer const. Mutable est pour certains cas spécifiques, et avant de l'utiliser vous devez vous assurer que ce dont vous avez besoin est un membre de données mutable ... – Jts