Использование QMap и получение сообщений об ошибках компиляции

Я пытаюсь использовать "QMap" в прототипе класса:

    QMap<QString, TargetsInfo*> m_targets;

В методе доступа у меня есть:

    TargetsInfo* TargetsModel::addTarget(int division, int camera, int map) const {
        TargetsInfo* target = getTarget(division, camera, map);

        if (target == nullptr) {
            const QString key = makeKey(division, camera, map);
            target = new TargetsInfo();

            if ( target != nullptr ) {
                m_targets.insert(key, target);
            }
        }
        return target;
    }

    TargetsInfo* TargetsModel::getTarget(int division, int camera, int map) const {
        const QString key = makeKey(division, camera, map);
        QMap<QString, TargetsInfo*>::iterator itr = m_targets.find(key);
        return (its == m_targets.end()) ? nullptr : itr.value();
    }

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

    C2663: 'QMap<QString, TargetInfo *>::insert': 2 overloads have no legal conversion for 'this' pointer
    C2440: 'initialising': cannot convert from 'QMap<QString, TargetInfo *>::const_iterator' to 'QMap::<QString, TargetInfo *>::iterator'
    No constructor could take the source type, or constructor overload resolution was ambiguous

person SPlatten    schedule 19.03.2020    source источник
comment
Почему addTarget отмечен как const? Я бы ожидал, что добавление чего-то где-то изменяет контейнер.   -  person StoryTeller - Unslander Monica    schedule 19.03.2020
comment
@StoryTeller-UnslanderMonica, спасибо, ошибка вырезания и вставки, я удалил константу, и это избавило от ошибки C2663, сообщение C2440 все еще есть.   -  person SPlatten    schedule 19.03.2020


Ответы (1)


Для второго изменения ошибки

QMap<QString, TargetsInfo*>::iterator itr = ...

to

QMap<QString, TargetsInfo*>::const_iterator itr = ...

Ваш метод getTarget является константным, поэтому m_targets.find возвращает константный итератор (иначе вы могли бы изменить m_targets внутри своего предположительно константного метода).

Для первой ошибки удалите const из метода addTarget. Очевидно, что метод, добавляющий элементы в m_targets, не должен быть константным.

person john    schedule 19.03.2020
comment
Типичный случай, когда auto действительно сияет, поскольку автоматически выводит правильный тип итератора. - person epsilon; 20.03.2020