我有QSet<QuadPattern> texture;
,我想在循环中修改所有QuadPattern。
foreach
不是一个好的解决方案,因为它会复制。
使用此代码:
QMutableSetIterator<QuadPattern> it(texture); while (it.hasNext()) { it.next(); it.value().setCoordinate(...)); }
我收到编译错误:
error: C2662: 'QuadPattern::setCoordinate' : cannot convert 'this' pointer from 'const QuadPattern' to 'QuadPattern &'
Conversion loses qualifiers
函数setCoordinate
是这样的:
inline void setCoordinate(const std :: pair&amp; value){_ unsordinate = value; }
为什么会出现此错误?
答案 0 :(得分:5)
错误是因为您尝试修改QMutableSetIterator::value()
函数返回的 const 对象。
我相信你不能以这种方式修改你的套装,因此没有这样的API。修改所有项目所需的只需清除集合并再次插入新项目。
答案 1 :(得分:0)
QMutableSetIterator::value()
有一个很好的理由来返回一个const引用。集合中的项目根据其哈希值在内部编制索引。如果您想要更改项目,通常需要删除并重新插入该项目。如果您希望避免复制数据,请将QuadPattern
隐式共享类:
class QuadPatternData : public QSharedData
{
...
};
class QuadPattern {
QSharedDataPointer<QuadPatternData> d;
public:
QuadPattern() : d(new QuadPatternData) {}
QuadPattern(const QuadPattern & other) : d(other.d) {}
QuadPattern(QuadPattern && other) { d.swap(other.d); }
void setCoordinate( ... ) { d->coordinate = ...; }
...
};