Почему я не могу использовать Java-Style QMapIterator в QMap.erase ()? - PullRequest
1 голос
/ 22 мая 2019

Я пытаюсь этот код в Qt 5.12:

//Definition of map
QMap<int, ZoneData*>           mapId2Pointer_;

//Some values filled in mapId2Pointer_ here...

        QMapIterator<int, ZoneData*> iteratorId2Pointer(mapId2Pointer_);
        while (iteratorId2Pointer.hasNext())
        {
            iteratorId2Pointer.next();
            if (iteratorId2Pointer.value() == _climbZoneData)
            {
                iteratorId2Pointer = mapId2Pointer_.erase(iteratorId2Pointer); //<- ERROR
            }
        }

Но в последней строке кода компилятор выдает эту ошибку:

error: нет подходящей функции для вызова 'QMap :: erase (QMapIterator &) 'iteratorId2Pointer = mapId2Pointer_.erase (iteratorId2Pointer);

Я видел много примеров и много гуглил, но безуспешно.Все примеры похожи на приведенные выше, каждый использует QMapIterator в качестве параметра в вызове QMap :: erase ().Но в моем коде невозможно выполнить преобразование из QMapIterator в QMap :: iterator.

В чем может быть причина этой ошибки?

1 Ответ

3 голосов
/ 22 мая 2019

QMapIterator - это «итератор в стиле Java», а QMap::iterator - «итератор в стиле STL».Они не совместимы;вам нужно использовать один или другой.

Вы можете выполнять итерацию, используя QMap::iterator, например:

QMap<int, ZoneData*>::iterator i = mapId2Pointer_.begin();
while(i != mapId2Pointer_.end()) {
    if (i.value() == _climbZoneData) {
        i = mapId2Pointer_.erase(i);
    } else {
        ++i;
    }
}

Обратите внимание, что если вы не стирали объекты в середине (что делает недействительнымваш итератор, требующий, чтобы вы установили для него возвращаемое значение из erase), вместо этого вы можете использовать цикл for.

...