使用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
相关产品推荐
相关产品推荐

