2012-01-06 56 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類型的。