2011-12-17 108 views
1

當我試圖編譯VS2010中的以下代碼時,錯誤C2678提示。map <string,string>在類

#include <string> 
#include <map> 
using namespace std; 
class test 
{ 
    private: 
     map<string, string> data; 
    public: 
     test(){}; 
     ~test(){}; 
    public: 
     const string & get(const string & key)const{return data[key];}; //error C2678 
     bool set(const string & key, const string & value){data[key]=value;return true;}; 
}; 
void main() 
{ 
    const string key="Hello world!"; 
    const string value="I'm coming!"; 
    test t; 
    t.set(key,value); 
    t.get(key); 
} 

但是,當我離開它的功能類似於

#include <string> 
#include <map> 
using namespace std; 
bool set(const string & key, const string & value, map<string, string> & data) 
{ 
    data[key]=value; 
    return true; 
} 
const string & get(const string & key, map<string, string> & data) 
{ 
    return data[key]; 
} 
void main() 
{ 
    const string key="Hello world!"; 
    const string value="I'm coming!"; 
    map<string, string> data; 
    set(key, value, data); 
    get(key; 
} 

它編譯和運行。

有誰知道有什麼問題嗎?

+0

將來,請粘貼錯誤文本,而不僅僅是數字。 – 2011-12-17 03:50:39

回答

6

你已經將你的測試類的get成員函數聲明爲const。但std::mapoperator[]是一個非const函數,所以它不能從const函數調用。改用find函數。

operator[]是非常量的原因是因爲如果該鍵不存在,那麼它會將其與缺省構造值一起插入到映射中。

+0

即使我不改變它? – 2011-12-17 03:42:43

+1

@ Y.Z。 :問題是如果找不到,運算符[]會插入鍵。所以即使你沒有分配它,它仍然可能會導致一個變化。 – 2011-12-17 03:45:06

3

要找到一個const映射一個對象,你需要使用find成員函數,你不能使用operator[]

const string & get(const string & key)const {return data.find(key)->second;} 

注意,這個假設的關鍵始終存在。

相關問題