Я пробую этот код в 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
}
}
Но в последней строке компилятор кода выдает эту ошибку:
ошибка: нет соответствующей функции для вызова 'QMap::erase(QMapIterator&)' iteratorId2Pointer = mapId2Pointer_.erase(iteratorId2Pointer);
Я видел много примеров и много гуглил, но безуспешно. Все примеры похожи на приведенный выше, каждый использует QMapIterator в качестве параметра в вызове QMap::erase(). Но преобразование из QMapIterator в QMap::iterator в моем коде кажется невозможным.
Что может быть причиной этой ошибки?
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.
О боже. Вы совершенно правы. Я предположил, что итератор Java взаимозаменяем с итератором STL. Я не заметил такой тонкой разницы. Вот почему я закончил поиск некоторого (несуществующего) приведения типов между ними. Просто, ясно и лаконично. Спасибо!!