![](/img/trans.png)
[英]C++: huge errors using clang to compile a map with iterators as values
[英]Compile error using map iterators
在我的頭文件中,我已經包含了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中)
似乎在這個循環存在的范圍內,映射是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迭代器,所以不能使用它們來修改地圖或其中的數據。 這是const的正確性,這是一件好事:)。
好吧,錯誤說您正在嘗試將const_iterator強制轉換為迭代器。 你說pT_Spam
是會員。 它是const對象的成員嗎? 如果是,則begin()和end()將返回const_iterators。
您需要將const_iterators用於地圖,因此它應該是:
for(map<unsigned int, double>::const_iterator it = \\and so on
編輯:正如上面指出的那樣是正確的,但是出於完全錯誤的原因(地圖有非const迭代器。我在想什么呢?我不知道)。 很可能你的地圖被定義為const(如另一個答案中所指出的)。
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類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.