Qhash 的 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"作为"QHash::迭代器 QHash::insert(const Key&, const T&) [with Key = int;T = int]' 丢弃限定符 [-允许] motifByCell2seq->value(motif).value(cell).insert(si,1);

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

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

你能帮我找出问题所在吗?

简短版本:value() 方法返回一个常量,因此尝试执行value().insert()就是尝试修改该常量值。 operator[]可以返回一个常量,在这种情况下,很明显它选择这样做。 如果将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);
然后

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

相关内容

  • 没有找到相关文章

最新更新