【发布时间】: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)
为什么在这些情况下会出现这个错误?
我知道pairsIter 是std::vector<MyPair>::iterator,range.first 是MyMap::iterator,但是,我的期望是取消引用迭代器返回类型,在这种情况下,std::pair<char, char> 用于两个迭代器。
为什么我需要明确说明?
【问题讨论】:
-
这还不是完整的错误信息;这还包含
_Ty1和_Ty2在这种特殊情况下所代表的内容。如果你读过这篇文章,它就会暗示解决方案。 -
@Angew 啊,是的,这将教会我在涉及模板时更频繁地查看输出窗口
-
在 *pairsIter 周围设置括号还不够吗?这就像隐式转换,您可以直接比较它们
标签: c++ visual-studio-2010 c++11 multimap std-pair