2011-12-17 103 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;} 

注意,这个假设的关键始终存在。

相关问题