我用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);
你能帮我找出问题吗?
答案 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);
当然,把我删除的其他内容放回去,然后写一个测试来确认这是按预期工作的。