Ошибка компиляции с использованием итераторов карты - PullRequest
8 голосов
/ 06 января 2012

В моем заголовочном файле я включил 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*/}

Выше упомянуто даже в одном примере использования std :: map на cplusplus.com. Хотя я сделал то же самое в других частях кода, которые не вызывают ошибок компиляции, в этой конкретной строке я получаю следующую ошибку от 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 ]

16 голосов
/ 06 января 2012

Казалось бы, что в области действия этой петли существует карта постоянная.Например, объявлен ли цикл в методе класса const, например, так:

void method() const // const method
{
    // Do stuff.
}

или передан в качестве аргумента const, как этот?

void function(const map<unsigned int, double>& pT_Spam)
{
    // Do stuff.
}

используйте константные итераторы:

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*/
}

Так как в показанном вами случаеВы должны использовать константные итераторы, вы не можете использовать их для изменения карты или данных в ней.Это правильность, и это хорошо:).

3 голосов
/ 06 января 2012

Ну, ошибка говорит о том, что вы пытаетесь привести const_iterator к итератору.Вы говорите, что pT_Spam является участником.Это член const объекта?Если это так, begin () и end () вернут const_iterators.

2 голосов
/ 06 января 2012

Вам необходимо использовать const_iterators для карт, поэтому оно должно быть:

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

Редактировать: Как указано выше, это правильно, но по совершенно неверным причинам (у карт есть неконстантные итераторы. О чем я думал? Я не знаю). Скорее всего, ваша карта определена как const (как указано в другом ответе).

1 голос
/ 16 декабря 2015

для (map :: iterator it = pT_Spam.begin (); it! = PT_Spam.end (); it ++)

смените его на

для (map :: const_iterator it = pT_Spam.begin (); it! = PT_Spam.end (); it ++)

Так как он указывает на постоянное значение, итератор также должен быть константного типа.

...