使用map迭代器编译错误

时间:2012-01-06 01:42:10

标签: c++ map iterator compiler-errors

在我的头文件中,我已经包含了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中)

4 个答案:

答案 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类型。