Qhash的Qhash报告错误

时间:2015-01-09 15:13:10

标签: c++ qt qhash

我用qhash的qhash编写了一个函数,如下所示:

void scanOccurenceOnAllSequence(QString motif, QString chkMotif, qint32 offset, QString cell, QHash <QString, QHash <QString, QHash<qint32, qint32> > > *motifByCell2seq, QList<QString> *peakSequence){
    qint32 peakSequenceNumber = peakSequence->size();
    for(qint32 si=0; si < peakSequenceNumber; si++){
    if( motifByCell2seq->value(motif).value(cell).contains(si) ||  motifByCell2seq->value(motif).value(cell).contains(si) ){
        continue;
    }

    bool flag = checkMotifOccurence(motif,chkMotif,peakSequence->at(si),offset);

    if(flag){
        motifByCell2seq->value(motif).value(cell).insert(si,1);
    }
    }
}

但是,此行存在错误:

motifByCell2seq->value(motif).value(cell).insert(si,1);

错误是:

  

错误:将'const QHash'作为'this'参数传递给'QHash :: iterator QHash :: insert(const Key&amp;,const T&amp;)[with Key = int; T = int]'丢弃限定符[-fpermissive]   motifByCell2seq-&GT;值(基元)。价值(小区).insert(SI,1);

即使我将此行更改为以下内容,仍然存在错误

motifByCell2seq[motif][cell].insert(si,1);

你能帮我找出问题吗?

1 个答案:

答案 0 :(得分:0)

简短版本 value()方法返回一个const,因此尝试value().insert()尝试修改该常量值。 operator[]可以返回一个const,显然在这种情况下它会选择这样做。如果将motifByCell2seq[motif][cell]分配给临时变量,则可以强制使用非常量operator[]

长版: 作为解决这个问题的策略(也就是说,我为了达到上面的简短版本而做了什么),我会将问题线分解成碎片,将每个问题分配给它自己的临时变量。

所以,首先值得简化。例如,需要bool标志行和if语句上的标志来重新创建错误,所以现在将它们注释掉。对于for循环中第一个的if语句也是如此。

所以,目前,我已将问题简化为:

void scanOccurenceOnAllSequence(QString motif,
                                QString chkMotif,
                                qint32 offset,
                                QString cell,
                                QHash <QString, QHash<QString, QHash<qint32, qint32> > > *motifByCell2seq,
                                QList<QString> *peakSequence)
{ 
    qint32 si=0;
    motifByCell2seq[motif][cell].insert(si,1);                                                                               
}

从那里,我改变问题行替换为:

QHash<QString, QHash<qint32, qint32> > tmp1;
tmp1 = motifByCell2seq[motif];
tmp1[cell].insert(si,1);

现在问题仍然存在,仍然在最后一行,缩小了搜索范围。

另一次迭代让我:

    QHash<QString, QHash<qint32, qint32> > tmp1;
    tmp1 = motifByCell2seq[motif];
    QHash<qint32, qint32> tmp2;
    tmp2 = tmp1[cell];
    tmp2.insert(si,1);                                                                                    

这很有效。因此,在这种情况下将cell查找分配给临时变量会更改行为。从那里开始,我想我应该仔细查看QHash的文档,这是我注意operator[]的两个版本的地方。另外,我注意到您首先尝试的value()方法只有const版本。

现在发现了问题,我可能会回到:

QHash<qint32, qint32> cellHash = (*motifByCell2seq)[motif][cell];
cellHash.insert(si,1);

当然,把我删除的其他内容放回去,然后写一个测试来确认这是按预期工作的。