2014-06-27 32 views
2

我有QSet<QuadPattern> texture;,我想修改一個循環中的所有QuadPattern。如何修改QSet的元素?

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是這樣的:

內嵌無效setCoordinate(常量std :: pair & value){_coordinate = value; }

爲什麼會出現此錯誤?

回答

4

錯誤是因爲您試圖修改QMutableSetIterator::value()函數返回的對象。

我相信你不能以這種方式修改你的設置的項目,因此沒有這樣的API。您需要修改所有項目只需清除該設置並再次插入新項目。

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 = ...; } 
    ... 
};