2016-02-27 39 views
0

我正在實施以下方法來刪除與map::erase()從一個關聯表(map)元素:當使用map :: erase()「錯誤:傳遞'***'作爲'***'參數丟棄限定符[-fpermissive]」報告

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

哪裏ObjPtrObjects類型的對象的虛擬指針。

當我編譯我得到這個錯誤:

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,我無法對其進行修改。

+0

無關,但你可能想通過常量引用,而不是按值傳遞'nomobjetg'。這是'void Gestion :: EliminateObject(const string&nomobjetg)'。如果這是一個std :: string,它會做一個浪費的字符串複製。 –

回答

1

void Gestion::EliminateObject(string nomobjetg) const

您試圖修改objectname與您的來電objectname.erase(it)const功能不會讓你這樣做,除非objectname可變

刪除常量:

void Gestion::EliminateObject(string nomobjetg) 

objectname可變

mutable Objectmap objectname; 
+0

謝謝!對於第一個選項,你是否建議用'*'改變'const'?爲什麼只是消除'const'並不能解決問題? – Marco

+1

*是一個錯字,我現在修復了它...是的,我只是刪除const。可變的是針對一些特定的情況,在使用它之前,你應該確保你需要的是一個可變數據成員...... – Jts

相關問題