Нет соответствующей функции для вызова при переносе проекта из qt4 в qt5

Я переношу проект из Qt4 в Qt5, фактически я закончил его миграцию, но теперь мне нужно перенести библиотеки, и я столкнулся с проблемой, которую не могу решить:

..\qenc\ShapeLandPOI.cpp: In member function 'virtual void ShapeLandPOI::draw(QPainter*)':
..\qenc\ShapeLandPOI.cpp:74:92: error: no matching function for call to 'QMap<QString, ShapeAttribute>::iterator::iterator(QMap<QString, ShapeAttribute>::const_iterator)'
         AttributeSet::iterator vItPOI = (AttributeSet::iterator)attributes.at(i).find("POI");
note: candidates are:QMap<Key, T>::iterator::iterator(QMap<Key, T>::Node*) [with Key = QString; T = ShapeAttribute; QMap<Key, T>::Node = QMapNode<QString, ShapeAttribute>]
         inline iterator(Node *node) : i(node) { }
                ^

После этого я получаю еще одну ошибку ниже, но я думаю, что, как только ошибка, описанная выше, будет решена, эта проблема не будет проблемой, хотя это может помочь узнать, что происходит:

..\..\..\..\..\Qt5\5.2.1\mingw48_32\include\QtCore/qmap.h:423:16: note:   no known conversion for argument 1 from 'QMap<QString, ShapeAttribute>::const_iterator' to 'QMap<QString, ShapeAttribute>::Node* {aka QMapNode<QString, ShapeAttribute>*}'
..\..\..\..\..\Qt5\5.2.1\mingw48_32\include\QtCore/qmap.h:422:16: note: QMap<Key, T>::iterator::iterator() [with Key = QString; T = ShapeAttribute]
         inline iterator() : i(0) { }
                ^

эти две строки дают проблемы:

AttributeSet::iterator vItPOI = (AttributeSet::iterator)attributes.at(i).find("POI");
AttributeSet::iterator vItPOI0 = (AttributeSet::iterator)attributes.at(i).find("POI0");

Я, честно говоря, не знаю, как исправить эти строки, чтобы они соответствовали предложенным функциям кандидата. Я надеюсь, что кто-то может пролить свет на эту тему. Спасибо.

РЕДАКТИРОВАТЬ: я попытался использовать static_cast вместо этого, но это все та же ошибка.

1 ответ

Я решил это поворотом

AttributeSet::iterator vItPOI = (AttributeSet::iterator)attributes.at(i).find("POI");

в

ShapeAttribute vItPOI = attributes.at(i).find("POI").value();

и изменение очень маленькой части кода, например, у меня было

if (vItPOI  == attributes.at(i).end()) continue;

и изменил его на

    if (attributes.at(i).find("POI") == attributes.at(i).end()) continue;

Таким образом, функциональность должна оставаться прежней. Мне повезло, потому что переменная использовалась только для получения строкового значения атрибута shape, за исключением нескольких случаев, когда мне не нужно было много менять.

Другие вопросы по тегам