【问题标题】:Comparing dereferenced map iterators (std::pairs): C2678比较取消引用的映射迭代器(std::pairs):C2678
【发布时间】:2013-11-21 11:11:03
【问题描述】:

考虑以下示例代码:

#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&lt;MyPair&gt;::iteratorrange.firstMyMap::iterator但是,我的期望是取消引用迭代器返回类型,在这种情况下,std::pair&lt;char, char&gt; 用于两个迭代器。

为什么我需要明确说明?

【问题讨论】:

  • 这还不是完整的错误信息;这还包含_Ty1_Ty2 在这种特殊情况下所代表的内容。如果你读过这篇文章,它就会暗示解决方案。
  • @Angew 啊,是的,这将教会我在涉及模板时更频繁地查看输出窗口
  • 在 *pairsIter 周围设置括号还不够吗?这就像隐式转换,您可以直接比较它们

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


【解决方案1】:

原因是std::multimap&lt;char, char&gt;::value_type(这也是解引用迭代器给你的)不是std::pair&lt;char, char&gt;。这是std::pair&lt;const char, char&gt;。这样一来,您就无法修改存储在地图中的项目的键,这可能会破坏地图的不变量。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 2022-01-04
    • 2015-01-23
    • 2014-11-04
    • 1970-01-01
    • 2014-04-03
    相关资源
    最近更新 更多