2012-01-06 59 views
8

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

这是抱怨,由begin()返回的迭代器是一个const_iterator,但你将它分配给一个迭代器。但我不知道为什么,这对我来说也是正确的。这是什么编译器? – Joe 2012-01-06 01:53:09

+0

[begin()](http://cplusplus.com/reference/stl/map/begin/)似乎也能够返回非常量迭代器。 我在Windows上使用Cygwin的g ++。 – jathanasiou 2012-01-06 01:58:00

回答

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,那么你应该使用自动关键字:

for(auto it=pT_Spam.begin() ; it!=pT_Spam.end(); it++) 
{ 
    /*code*/ 
} 

既然你已经证明你必须使用const iterator,你不能用它们来修改地图或其中的数据。这是常数正确的,这是一件好事:)。

+2

-.25以自杀的方式杀死小猫。 ;) – 2012-01-06 02:05:04

+1

另一种方法是将该成员标记为['mutable'](http://www.highprogrammer.com/alan/rants/mutable.html)。但是不要告诉任何人我告诉过你:-) – 2012-01-06 02:05:30

+0

运行该循环的方法确实是const的,这让我明白为什么映射在它的范围内也是const。考虑到我不需要在这个方法中编辑它,常量迭代器似乎是答案。 – jathanasiou 2012-01-06 02:07:41

2

您需要使用const_iterators地图,所以它应该是:

for(map<unsigned int, double>::const_iterator it = \\and so on 

编辑:以上是对的,但指出,完全是错误原因(地图有非常量迭代器,我究竟在想什么?我不知道)。最有可能你的地图被定义为const(正如在另一个答案中指出的那样)。

+1

改变它们的值(it ++)会不会导致问题?此外,我一直在使用常规迭代器进行类似的循环,从来没有出现过问题。 – jathanasiou 2012-01-06 01:52:49

+2

嗯,什么? map有非常量迭代器。 – 2012-01-06 01:54:51

+1

@JohnAthanasiou:可变常量迭代器与const非const迭代器不一样!认为'T const *'vs'T * const'。 – 2012-01-06 01:58:03

3

嗯,错误说你正在试图将const_iterator强制转换为迭代器。你说pT_Spam是一个成员。它是一个const对象的成员吗?如果是,begin()和end()将返回const_iterators。

+0

不知道说实话,它是我的'nbclassifier'类的一个声明的私有成员,而执行该循环的方法也是该类的成员。 – jathanasiou 2012-01-06 02:04:11

+0

另一种方法是将该成员标记为['mutable'](http://www.highprogrammer.com/alan/rants/mutable.html)。但是不要告诉任何人我告诉过你:-) – 2012-01-06 02:05:00

+0

Const正在某处。如果成员变量没有被声明为const,并且该方法没有被声明为const,那么可能该方法正在被一个const对象调用(这会使得该成员变量隐含地为const)。编译器错误是否带有调用堆栈?编辑:等待,如果它在一个const对象上被调用,它必须是一个const方法。 – 2012-01-06 02:12:22

1

为(地图:迭代它= pT_Spam.begin();!它= pT_Spam.end();它++)它

CHAGE到

为(地图::为const_iterator它= pT_Spam。因为它指向常量值,因此迭代器也必须是const类型的。