【问题标题】:Using QMap and getting compile error messages使用 QMap 并获取编译错误消息
【发布时间】:2020-03-19 10:10:46
【问题描述】:

我正在尝试在类原型中使用“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

【问题讨论】:

  • 为什么addTarget 标记为const?我希望在某处添加一些东西会修改容器。
  • @StoryTeller-UnslanderMonica,谢谢,剪切和粘贴错误,我删除了 const 并摆脱了 C2663 错误,仍然有 C2440 消息。

标签: c++ qt qmap


【解决方案1】:

对于第二个错误更改

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

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

您的 getTarget 方法是 const,因此 m_targets.find 返回一个 const 迭代器(否则您可以在您所谓的 const 方法中更改 m_targets)。

对于第一个错误,请从您的 addTarget 方法中删除 const。显然,将项目添加到 m_targets 的方法不应该是 const。

【讨论】:

  • auto 真正出色的典型案例,因为它会自动推断出正确的迭代器类型。
猜你喜欢
  • 1970-01-01
  • 2010-12-26
  • 2013-06-12
  • 1970-01-01
  • 2021-08-20
  • 2011-10-07
  • 2012-02-17
  • 1970-01-01
相关资源
最近更新 更多