3

我有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是这样的:

内联 void setCoordinate(const std::pair &value) { _coordinate = value; }

为什么会出现这个错误?

4

2 回答 2

6

错误是因为您尝试修改函数返回的const对象QMutableSetIterator::value()

我相信你不能以这种方式修改你的套装项目,因此没有这样的 API。您需要修改所有项目只是清除集合并再次插入新项目。

于 2014-06-27T09:22:11.987 回答
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 = ...; }
  ...
};
于 2014-06-27T15:36:50.573 回答