<оператор отсутствует при переборе карты С ++ - PullRequest
2 голосов
/ 25 июня 2009

Следующий код не хочет компилироваться. Смотрите прилагаемое сообщение об ошибке.

Код:

#include <map>
#include <vector>
#include <iostream>

class MapHolder {
public:
    std::map<std::vector<std::string>,MapHolder> m_map;

    void walk_through_map() {
        std::map<std::vector<std::string>,MapHolder>::iterator it;
        for(it = m_map.begin(); it < m_map.end(); ++it) {
            it->second.print();
        }
    }

    void print() { std::cout << "hey" << std::endl; }
};

int
main(int argc, char *argv[])
{
    MapHolder m;
    m.walk_through_map();
}

Ошибка:

$ g++ test.cc -O test
test.cc: In member function 'void MapHolder::walk_through_map()':
test.cc:12: error: no match for 'operator<' in 'it < ((MapHolder*)this)->MapHolder::m_map.std::map<_Key, _Tp, _Compare, _Alloc>::end [with _Key = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, _Tp = MapHolder, _Compare = std::less<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, _Alloc = std::allocator<std::pair<const std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, MapHolder> >]()'

Я использовал этот тип карты и повторяющийся процесс несколько раз. В чем здесь проблема? Как это можно решить.

(код выглядит бессмысленным, но это сокращенный пример, который все еще должен работать)

Ответы [ 2 ]

6 голосов
/ 25 июня 2009

Используйте! = Вместо <в сравнении итераторов. </p>

1 голос
/ 26 июня 2009

оператор <доступен только для итераторов с произвольным доступом. Поскольку std :: maps обычно реализуются с использованием некоторого сбалансированного дерева, обычно нет быстрого способа выяснить, указывает ли один итератор на элемент перед другим (хотя end является исключением). </p>

Полагаю, причина этого в том, что эти загадочные ошибки компилятора заставляют вас снова подумать о своем коде и реализовать оператор <сам, если вы обнаружите, что это лучший способ решить вашу проблему. </p>

...