请考虑以下示例代码:
#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)
为什么在这些情况下会发生此错误?
我理解pairsIter
是std::vector<MyPair>::iterator
,而range.first
是MyMap::iterator
,但是,我的期望是解除引用迭代器为两个迭代器返回类型,在本例中为std::pair<char, char>
。
为什么我需要明确它?
答案 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>
。