3

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

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

4

2 回答 2

6

operator[]is not 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
    }
  }
于 2013-09-06T07:09:06.553 回答
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
{

}
于 2013-09-06T07:26:24.580 回答