1

我有这个(简化的)代码可以正常工作。

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];
                    ^
4

2 回答 2

4

由于get方法是const,所有数据成员,包括m,都被视为常量。但是, a 上[]运算符map不是常数。改用该at方法,它有一个const重载:

val = m.at(key);
于 2013-06-19T02:33:48.587 回答
1

在该const方法中,第一个容器的类型变为有效map<string, int>* const指针是 const,指针不是)。第二个容器的类型变为const map<string, int>

operator[]要求对象是非常量的,因为如果找不到一个新元素,它可能必须变异以添加新元素。因此,在第一种情况下,取消引用的指针仍然指向 const 函数内的非 const 容器,而在第二种情况下,容器本身被视为 const。

如果您要搜索的密钥不存在,您希望发生什么?如果你想创建它,你的 get 函数不能是 const。

如果您不希望创建它,则使用地图的find方法找到您想要的项目(或者end()如果找不到,则决定合适的行为)。

于 2013-06-19T02:31:22.653 回答