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
。这样,您就不能修改存储在映射中的项的键,这可能会破坏映射的不变量
如果将取消引用的结果分配(或强制转换)到typestd::pair
,则比较有效。如果您试图直接比较不同的对类型,则会出现错误
您可以通过强制转换或提供自己的函数(重载
操作符==
或命名函数)来比较不同的类型来解决这个问题。或者,更一般地说,对于比较std:pair
和std::pair
,原因是std::multimap::value\u type
(这也是解引用迭代器提供的)是而不是std::pair
。它是std::pair
。这样,您就不能修改存储在映射中的项的键,这可能会破坏映射的不变量
如果将取消引用的结果分配(或强制转换)到typestd::pair
,则比较有效。如果您试图直接比较不同的对类型,则会出现错误
您可以通过强制转换或提供自己的函数(重载
操作符==
或命名函数)来比较不同的类型来解决这个问题。或者,更一般地说,对于比较std:pair
和std::pair
,这仍然不是完整的错误消息;它还包含在这个特殊情况下\u Ty1
和\u Ty2
所代表的内容。如果您读过这篇文章,它会暗示解决方案。@Angew啊,是的,这会教我在涉及模板时更频繁地查看输出窗口。在*pairsIter周围设置括号是否足够?这就像隐式转换,您可以直接比较它们,但这仍然不是完整的错误消息;它还包含在这个特殊情况下\u Ty1
和\u Ty2
所代表的内容。如果您读过这篇文章,它会暗示解决方案。@Angew啊,是的,这会教我在涉及模板时更频繁地查看输出窗口。在*pairsIter周围设置括号是否足够?这就像隐式转换,您可以直接比较它们