При использовании map::erase() "ошибка: передача 'const ***' в качестве 'this' аргумента '***' отбрасывает квалификаторы [-fpermissive]" сообщается

Я реализую следующий метод для удаления элемента из ассоциативной таблицы (map) с map::erase():

//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
}

В шапке я определил следующее:

//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;
};

куда ObjPtr это виртуальный указатель объектов типа Objects,

Когда я компилирую, я получаю эту ошибку:

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);

Почему эта строка сообщает об этой ошибке? Я видел некоторые другие сообщения с этим типом ошибки, но в этих случаях основная причина проблемы связана с тем, как метод объявлен (const). В этом случае метод, связанный с проблемой erase и я не могу изменить это.

1 ответ

Решение

void Gestion:: EliminateObject (string nomobjetg) const

Вы пытаетесь изменить objectname с вашим звонком objectname.erase(it)и const функция не позволит вам сделать это, если objectname изменчиво

Удалить const:

void Gestion::EliminateObject(string nomobjetg)

или же

Делать objectname изменчивый

mutable Objectmap objectname;
Другие вопросы по тегам