我对以下代码感到困惑,为什么无法成功编译?
class Test {
public:
int GetValue( int key ) const
{
return testMap[key];
}
map<const int, const int> testMap;
};
始终存在编译错误:
error C2678: binary '[': no operator found which takes "const std :: map <_Kty,_Ty>" type of the left operand operator (or there is no acceptable conversion).
我试图将const限定符放在任何地方,但它仍然无法通过。你能告诉我为什么吗?
答案 0 :(得分:6)
operator[]
不是const
,因为如果某个元素与给定的密钥不存在,则会插入一个元素。 find()
确实有const
重载,因此可以使用const
实例或const
引用或指针调用它。
在C ++ 11中,有std::map::at()
,它添加了边界检查,如果没有给定键的元素,则引发异常。所以你可以说
class Test {
public:
int GetValue( int key ) const
{
return testMap.at(key);
}
std::map<const int, const int> testMap;
};
否则,请使用find()
:
int GetValue( int key ) const
{
auto it = testMap.find(key);
if (it != testMap.end()) {
return it->second;
} else {
// key not found, do something about it
}
}
答案 1 :(得分:0)
juanchopanza得到了一个很好的答案
只是希望以boost
方式显示返回无效的内容
使用boost::optional
您可以返回空类型
#include<boost\optional.hpp>
...
boost::optional<int> GetValue(int key){
auto it = testMap.find(key);
if (it != testMap.end()) {
return it->second;
} else {
return boost::optional<int>();
}
}
boost::optional<int> val = GetValue(your_key);
if(!val) //Not empty
{
}