карта <строка, строка> в классе - PullRequest
1 голос
/ 17 декабря 2011

Когда я пытался скомпилировать следующие коды в VS2010, выдается ошибка C2678.

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

Он компилируется и работает.

Кто-нибудь знает в чем проблема?

Ответы [ 2 ]

6 голосов
/ 17 декабря 2011

Вы объявили функцию-член вашего тестового класса как const.Но std::map operator[] является неконстантной функцией, поэтому ее нельзя вызвать из константной функции.Вместо этого используйте функцию find.

Причина, по которой operator[] не является константой, заключается в том, что если ключ не существует, он вставляется в карту вместе с созданным по умолчанию значением.

3 голосов
/ 17 декабря 2011

Чтобы найти объект на карте const, вам нужно использовать функцию-член find, вы не можете использовать operator[]:

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

Обратите внимание, что это предполагает, что ключ всегдасуществует.

...