Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 比较取消引用的映射迭代器(std::pairs):C2678_C++_Visual Studio 2010_C++11_Multimap_Std Pair - Fatal编程技术网

C++ 比较取消引用的映射迭代器(std::pairs):C2678

C++ 比较取消引用的映射迭代器(std::pairs):C2678,c++,visual-studio-2010,c++11,multimap,std-pair,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<

考虑以下示例代码:

#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;
}
#包括
#包括
int main(){
typedef std::pair MyPair;
typedef std::multimap MyMap;
typedef std::pair MyRange;
std::向量对;
MyMap bigMapOfStuff;
//…将东西添加到配对中
自动配对器=pairs.begin();
MyRange range=bigMapOfStuff.equal_range('a');
//…范围验证检查
MyPair=*range.first;
如果(对==*pairsIter){//OK
//...
}
如果(*pairister==*range.first){//C2678
}
配对=*配对器;
如果(*range.first==pair){//C2678
//...
}
如果(*range.first==*pairsIter){//C2678
//...
}
如果((MyPair)*range.first==*pairsIter){//OK
//...
}
返回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)
错误C2678:二进制“==”:未找到接受“std::pair”类型的左侧操作数的运算符(或没有可接受的转换)
为什么在这些情况下会出现这种错误

我知道,
pairsIter
是一个
std::vector::iterator
范围。首先
是一个
MyMap::iterator
,然而,我的期望是,解引用迭代器返回类型,在本例中,
std::pair


为什么我需要明确说明它?

原因是
std::multimap::value\u type
(这也是解引用迭代器提供给您的)是而不是
std::pair
。它是
std::pair
。这样,您就不能修改存储在映射中的项的键,这可能会破坏映射的不变量

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


您可以通过强制转换或提供自己的函数(重载
操作符==
或命名函数)来比较不同的类型来解决这个问题。或者,更一般地说,对于比较
std:pair
std::pair
,原因是
std::multimap::value\u type
(这也是解引用迭代器提供的)是而不是
std::pair
。它是
std::pair
。这样,您就不能修改存储在映射中的项的键,这可能会破坏映射的不变量

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


您可以通过强制转换或提供自己的函数(重载
操作符==
或命名函数)来比较不同的类型来解决这个问题。或者,更一般地说,对于比较
std:pair
std::pair

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