如何提供对包装类的const只读访问

时间:2015-04-09 23:17:45

标签: c++ c++11

我有以下程序。我想要完成的是创建一个对unordered_map的可变包装器的常量引用,我可以传递它以进行只读查找。但是,由于operator []重载,我无法编译以下代码。

从这段代码中,有谁知道我做错了什么?

#include <unordered_map>
#include <string>

using std::unordered_map;
using std::string;

class M {
private:
    unordered_map<string, string> m;

public:
    string const& operator[](string const& s) const {
        return m[s]; // line 13
    }

    string& operator[](string const& s) {
        return m[s];
    }
};

int main() {
    M m;

    m[string("a")] = string("answer_a");

    M const& m1 = m;
    string const& test = m1[string("a")];

    return 0;
}

错误(第13行)是

  

错误:传递&#39; const std :: unordered_map,   std :: basic_string&gt;&#39;作为&#39;这个&#39;的论点   &#39; std :: __ detail :: _ Map_base&lt; _Key,_Pair,std :: _ Select1st&lt; _Pair&gt;,true,   _Hashtable&GT; :: mapped_type&安培; std :: __ detail :: _ Map_base&lt; _Key,_Pair,std :: _ Select1st&lt; _Pair&gt;,true,_Hashtable&gt; :: operator [](const _Key&amp;)   [使用_Key = std :: basic_string,_Pair = std :: pair,std :: basic_string&gt;,_ Hashtable =   std :: _ Hashtable,std :: pair,std :: basic_string&gt;,   的std ::分配器,   std :: basic_string&gt; &gt;,std :: _ Select1st,std :: basic_string&gt; &gt;中   std :: equal_to&gt;,   std :: hash&gt;,   的std :: __细节:: _ Mod_range_hashing,   的std :: __细节:: _ Default_ranged_hash,   std :: __ detail :: _ Prime_rehash_policy,false,false,true&gt;,   std :: __ detail :: _ Map_base&lt; _Key,_Pair,std :: _ Select1st&lt; _Pair&gt;,true,   _Hashtable&gt; :: mapped_type = std :: basic_string]&#39;抛弃限定符[-fpermissive]

1 个答案:

答案 0 :(得分:6)

unordered_map operator []是非const的,因为它在尚不存在时添加了map键。相反,你应该使用

return m.at(s);