在我的头文件中,我已经包含了std :: map并使用了相应的命名空间 我的一位成员是:
map<unsigned int, double> pT_Spam;
在我的.cpp文件中,我尝试做一些我经常做一段时间的事情:
for(map<unsigned int, double>::iterator it=pT_Spam.begin() ; it!=pT_Spam.end() ; it++) {/*code*/}
在cplusplus.com上使用std :: map的例子中,甚至提到了上述内容。即使我在代码的其他部分中完成了相同的操作,导致没有编译错误,但在这个特定的行上我从Cygwin得到以下错误:
error: conversion from `std::_Rb_tree_const_iterator<std::pair<const unsigned int, double> >' to non-scalar type `std::_Rb_tree_iterator<std::pair<const unsigned int, double> >' requested
这似乎很奇怪。知道什么可能是错的吗? (我的标题当然包含在我的.cpp中)
答案 0 :(得分:16)
似乎在这个循环存在的范围内,映射是const。例如,类方法中的循环是否声明为const,就像这样?
void method() const // const method
{
// Do stuff.
}
或作为const参数传递,像这样?
void function(const map<unsigned int, double>& pT_Spam)
{
// Do stuff.
}
如果是,则必须使用const迭代器:
for(map<unsigned int, double>::const_iterator it=pT_Spam.begin() ; it!=pT_Spam.end() ; it++)
{
/*code*/
}
或者,如果你使用的是C ++ 11,那么你应该使用auto关键字:
for(auto it=pT_Spam.begin() ; it!=pT_Spam.end(); it++)
{
/*code*/
}
因为在您显示的情况下必须使用const迭代器,所以不能使用它们来修改地图或其中的数据。那是正确的,这是一件好事:)。
答案 1 :(得分:3)
好吧,错误说您正在尝试将const_iterator强制转换为迭代器。你说pT_Spam
是会员。它是const对象的成员吗?如果是,则begin()和end()将返回const_iterators。
答案 2 :(得分:2)
您需要将const_iterators用于地图,因此它应该是:
for(map<unsigned int, double>::const_iterator it = \\and so on
编辑:正如上面指出的那样是正确的,但是出于完全错误的原因(地图有非const迭代器。我在想什么呢?我不知道)。很可能你的地图被定义为const(如另一个答案中所指出的)。
答案 3 :(得分:1)
for(map :: iterator it = pT_Spam.begin(); it!= pT_Spam.end(); it ++)
将它变为
for(map :: const_iterator it = pT_Spam.begin(); it!= pT_Spam.end(); it ++)
因为它指向常量值,所以迭代器也必须是const类型。