c ++ STL map.find()或map.operator []不能在具有const限定符的类成员函数中使用

时间:2013-09-06 07:07:45

标签: c++ map stl const member

我对以下代码感到困惑,为什么无法成功编译?

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限定符放在任何地方,但它仍然无法通过。你能告诉我为什么吗?

2 个答案:

答案 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
{

}