比较解除引用的地图迭代器(std :: pairs):C2678

时间:2013-11-21 11:11:04

标签: c++ visual-studio-2010 c++11 multimap std-pair

请考虑以下示例代码:

#include <map>
#include <vector>

int main() {
  typedef std::pair<char, char> MyPair;
  typedef std::multimap<char, char> MyMap;
  typedef std::pair<MyMap::iterator, MyMap::iterator> MyRange;

  std::vector<MyPair> pairs;
  MyMap bigMapOfStuff;

  //... adding things to pairs

  auto pairsIter = pairs.begin();

  MyRange range = bigMapOfStuff.equal_range('a');

  //... range validation checking

  MyPair pair = *range.first;
  if(pair == *pairsIter) { //OK
    //...
  }

  if(*pairsIter == *range.first) { //C2678
  }

  pair = *pairsIter;
  if(*range.first == pair) { //C2678
    //...
  }

  if(*range.first == *pairsIter) { //C2678
    //...
  }

  if((MyPair)*range.first == *pairsIter) { //OK
    //...
  }

  return 0;
}

在我评论的比较中// C2678 - 这是指Visual Studio 2010错误:

error C2678: binary '==' : no operator found which takes a left-hand operand of type 'std::pair<_Ty1,_Ty2>' (or there is no acceptable conversion)

为什么在这些情况下会发生此错误?

我理解pairsIterstd::vector<MyPair>::iterator,而range.firstMyMap::iterator但是,我的期望是解除引用迭代器为两个迭代器返回类型,在本例中为std::pair<char, char>

为什么我需要明确它?

1 个答案:

答案 0 :(得分:4)

原因是std::multimap<char, char>::value_type(这也是取消引用迭代器给你的东西)是 std::pair<char, char>。它是std::pair<const char, char>。就是这样,你不能修改地图中存储的项目的键,这可能会破坏地图的不变量。

如果您将取消引用的结果分配(或转换)为std::pair<char, char>类型,则比较有效。如果您尝试直接比较不同的对类型,则会出现错误。

您可以通过强制转换或提供自己的函数(operator==重载或命名函数)来比较不同类型来解决此问题。或者,更一般地说,用于比较std:pair<T, U>std::pair<const T, U>