3

我有一个QHash<QString, QVector<float> > qhash,并试图覆盖以下值QVector

void Coordinate::normalizeHashElements(QHash<QString, QVector<float> > qhash)
{
    string a = "Cluster";
    float new_value;
    float old_value;
    const char *b = a.c_str();
    float min = getMinHash(qhash);
    float max = getMaxHash(qhash);

    QHashIterator<QString, QVector<float> > i(qhash);
        while (i.hasNext())
        {
            i.next();
            if(i.key().operator !=(b))
            {
                for(int j = 0; j<i.value().size(); j++)
                {
                    old_value = i.value().at(j);
                    new_value = (old_value - min)/(max-min)*(0.99-0.01) + 0.01;
                    i.value().replace(j, new_value);
                }
            }
        }
}

i.value().replace(j, new_value);我在中风时遇到错误,说明如下:

C:\Qt\latest test\Prototype\Coordinate.cpp:266: 错误:将 'const QVector' 作为 'void QVector::replace(int, const T&) [with T = float]' 的 'this' 参数传递会丢弃限定符[-fpermissive]

谁能帮我解决这个问题?

4

1 回答 1

3

错误消息告诉您您正在尝试在实例上使用非const方法。const在这种情况下,您正在尝试QVector::replace调用const QVector. 这样做的主要原因是因为您正在使用QHashIterator,它只返回const来自 的引用QHashIterator::value()

要解决此问题,您可以在以下位置使用 STL 样式的迭代器而不是 Java 样式的迭代器QHash

QString b("Cluster");
QHash<QString, QVector<float> >::iterator it;
for (it = qhash.begin(); it != qhash.end(); ++it)
{
   if (it.key() != b)
   {
      for (int j=0; i<it.value().size(); j++)
      {
         old_value = it.value().at(j);
         new_value = (old_value-min)/(max-min)*(0.99-0.01) + 0.01;
         it.value().replace(j, new_value);
      }
   }
}

您也可以使用QMutableHashIterator代替QHashIterator.

于 2013-08-17T18:42:44.080 回答