C++ 如何提供对包装类的常量只读访问
我有以下程序。我想要完成的是在无序的_映射上创建一个对可变包装器的常量引用,我可以将其传递给只读查找。但是,由于运算符[]重载,我无法编译以下代码 从这段代码中,有人知道我做错了什么吗C++ 如何提供对包装类的常量只读访问,c++,c++11,C++,C++11,我有以下程序。我想要完成的是在无序的_映射上创建一个对可变包装器的常量引用,我可以将其传递给只读查找。但是,由于运算符[]重载,我无法编译以下代码 从这段代码中,有人知道我做错了什么吗 #include <unordered_map> #include <string> using std::unordered_map; using std::string; class M { private: unordered_map<string, string&
#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;
}
#包括
#包括
使用std::无序_图;
使用std::string;
M类{
私人:
无序地图m;
公众:
字符串常量和运算符[](字符串常量和运算符)常量{
返回m[s];//第13行
}
字符串和运算符[](字符串常量和s){
返回m[s];
}
};
int main(){
M M;
m[字符串(“a”)]=字符串(“答案a”);
M常数&m1=M;
字符串常量和测试=m1[字符串(“a”)];
返回0;
}
错误(第13行)为
错误:传递'const std::无序\u映射,
std::basic_string>'作为的'this'参数
'std::uu详细信息::u Map_ubase::mapped_utype&std:uu详细信息::Map_ubase::operator[](const u Key&)
[使用Key=std::basic_string,Pair=std::Pair,std::basic_string>,Hashtable=
std::_哈希表,std::对,std::基本字符串>,
分配器,
std::basic_string>>,std:_Select1st,std::basic_string>>,
标准::等于>,
std::hash>,,
标准::u详细信息::Mod_range_hashing,
标准::u详细信息::_默认值\u范围\u散列,
标准::u详细信息::Prime\uRehash\uPolicy,false,false,true>,
std::_详细信息::_Map_base::mapped_type=std::basic_string]'丢弃限定符[-fppermissive]
无序的_映射运算符[]是非常量的,因为它在不存在映射键时添加了一个映射键。相反,您应该使用
return m.at(s);
无序的_映射运算符[]是非常量的,因为它在不存在映射键时添加了一个映射键。相反,您应该使用
return m.at(s);
你做错的是没有阅读文档以了解
操作符[]
对地图的作用。不过,我不会对这个问题投反对票,这是一个公平的问题,我敢肯定我们所有人以前都犯过这样的错误。特别是当第三个投票最多的问题是这样的时候。你犯的错误是没有阅读文档以了解operator[]
对地图的作用。尽管如此,我不会否决这个问题,这是一个公平的问题,我敢肯定我们所有人以前都犯过这样的错误。特别是第三个投票最多的问题是什么时候。