Странное поведение или std :: map :: const_iterator - PullRequest
0 голосов
/ 01 января 2012

Я создаю итераторы:

typename Report::container_type_for_processed_files::const_iterator beg = rep.processed_files().begin();
            typename Report::container_type_for_processed_files::const_iterator end = rep.processed_files().end();

мой класс Report выглядит:

class Report
{
public:
typedef std::map<boost::filesystem3::path,
                 std::pair<unsigned long long/*code*/,
                           unsigned long long/*comment*/> > container_type_for_processed_files;
container_type_for_processed_files processed_files()const;
private:
container_type_for_processed_files processed_files_;
};

Обработанные файлы в cpp выглядят так:

typename Report::container_type_for_processed_files Report::processed_files()const
{
    return processed_files_;
}

, но послеинициализация итераторов, как показано в первых строках:

typename Report::container_type_for_processed_files::const_iterator beg = rep.processed_files().begin();
            typename Report::container_type_for_processed_files::const_iterator end = rep.processed_files().end();
            while (beg != end)
            {
                qDebug() << beg->first.c_str();//here I'm getting runtime error
                fout << "File name: " << (beg->first).c_str();


                ++beg;
            }

Я получаю ошибку: неверный параметр передан в функцию времени выполнения C.
Я также получаю сообщения на панели вывода при попытке инициации итераторов:
(Внутренняя ошибка: pc 0x201 в readm в psymtab, но не в symtab.)
Что происходит?

Ответы [ 2 ]

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

Без скомпилированного семпла, я не уверен, что это ваша проблема, но это выглядит подозрительно:

container_type_for_processed_files processed_files() const;

Скорее всего, вам следует возвращать const& в контейнер, в противном случае эта функция будет возвращать (потенциально временные) копии базового контейнера, и ваши итераторы окажутся недействительными (не итераторы для того же объекта, и возможно, итераторы для временных, чье время жизни закончилось).

Попробуйте с:

container_type_for_processed_files const& processed_files() const;
0 голосов
/ 01 января 2012

Одна проблема заключается в том, что rep.processed_files() возвращает копию основного контейнера. Следовательно, beg и end применяются к двум отдельным объектам; и не имеет смысла пытаться выполнить итерацию от начала одной карты до конца другой карты - она ​​будет повторяться после конца первого контейнера. Вы должны вернуть ссылку на содержащийся объект.

typename Report::container_type_for_processed_files & Report::processed_files()const
{
    return processed_files_; // Returns by reference
}

И вам нужно &, когда вы определите, умоляете и заканчиваете

typename Report::container_type_for_processed_files::const_iterator & beg = rep.processed_files().begin();
typename Report::container_type_for_processed_files::const_iterator & end = rep.processed_files().end();

Могут быть и другие проблемы, поднятые другими. Например, что такое qDebug?

...