2013-06-19 62 views
1

我有這個(簡化的)工作正常的代碼。在C++中丟棄限定符錯誤,並將地圖指針更改爲值

class T 
{ 
    map<string, int>* m; 
public:  

    T() 
    { 
     m = new map<string, int>(); 
    } 
    void get(const string& key, int& val) const 
    { 
     val = (*m)[key]; 
    } 
} 

當我改變了指針變成價值,

class T 
{ 
    map<string, int> m; 
public:  

    void get(const string& key, int& val) const 
    { 
     val = m[key]; 
    } 

}; 

我得到這個錯誤消息,有什麼不對?

In member function 'void T::get(const string&, int&) const': 
constTest.cpp:12:20: error: passing 'const std::map<std::basic_string<char>, int>' 
as 'this' argument of 'std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& ...' 
discards qualifiers [-fpermissive] 
     val = m[key]; 
        ^

回答

1

const的方法,所述第一容器的類型變爲有效map<string, int>* const(所述指針是常量,所述指針對象是不是)。第二個容器的類型變成const map<string, int>

operator[]要求該對象爲非常量,因爲如果找到一個「不能找到的元素,它可能必須進行變異才能添加新元素」。因此,在第一種情況下,解除引用的指針仍然指向const函數中的非const容器,而第二種情況下容器本身被視爲const。

如果您要搜索的密鑰不存在,您希望發生什麼?如果你想要它被創建,你的get函數不能是const。

如果您不希望創建它,請使用地圖的find方法找到您想要的項目(或end(),如果無法找到它,則決定合適的行爲)。

相關問題