You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用QMap时出现编译错误,请求技术排查帮助

问题分析与修复方案

你的两个编译错误都和成员函数的const修饰符直接相关,咱们逐个拆解清楚:

错误1:C2663 QMap::insert 的this指针转换问题

你把addTarget声明成了const成员函数,但这个函数的核心逻辑是往m_targets里插入新元素——const成员函数的规则是:它承诺不会修改类的成员变量,此时this指针是const TargetsModel*类型,所有成员变量都会被视为const属性。而QMap::insert是一个非const成员函数,根本不允许在const对象上调用,这就导致了this指针的转换错误。

错误2:C2440 迭代器类型不匹配

同样的,getTarget也是const成员函数,当你调用m_targets.find(key)时,返回的是QMap<QString, TargetsInfo*>::const_iterator(只读迭代器),但你却把它赋值给了普通的iterator(可写迭代器)。在const成员函数里,容器只允许返回只读迭代器,两者类型不兼容,自然编译失败。另外你代码里还有个笔误:判断条件里的its应该是itr。


修复后的完整代码

修正addTarget函数

既然这个函数需要修改成员变量,直接去掉const修饰符即可:

TargetsInfo* TargetsModel::addTarget(int division, int camera, int map) {
    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;
}

修正getTarget函数

把迭代器类型改成const_iterator,同时修正笔误:

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

最后提个小提醒:你用new创建了TargetsInfo对象,一定要记得在类的析构函数或者其他清理逻辑里手动delete这些对象,不然会造成内存泄漏哦。

内容的提问来源于stack exchange,提问作者SPlatten

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 00:22:28