Qhash的Qhash报错
Qhash of Qhash reports error
我用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);
错误是:
error: passing 'const QHash' as 'this' argument of 'QHash::iterator QHash::insert(const Key&, const T&) [with Key = int; T = int]' discards qualifiers [-fpermissive]
motifByCell2seq->value(motif).value(cell).insert(si,1);
即使我把这一行改成下面这样,还是有错误
motifByCell2seq[motif][cell].insert(si,1);
你能帮我找出问题吗?
短版:
value()
方法 return 是一个常量,因此尝试执行 value().insert()
就是试图修改该常量值。 operator[]
可以 return 一个常量,显然在这种情况下它选择这样做。如果将 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);
然后当然,把我删除的其他东西放回去,然后写一个测试来确认这是按预期工作的。
我用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);
错误是:
error: passing 'const QHash' as 'this' argument of 'QHash::iterator QHash::insert(const Key&, const T&) [with Key = int; T = int]' discards qualifiers [-fpermissive] motifByCell2seq->value(motif).value(cell).insert(si,1);
即使我把这一行改成下面这样,还是有错误
motifByCell2seq[motif][cell].insert(si,1);
你能帮我找出问题吗?
短版:
value()
方法 return 是一个常量,因此尝试执行 value().insert()
就是试图修改该常量值。 operator[]
可以 return 一个常量,显然在这种情况下它选择这样做。如果将 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);
然后当然,把我删除的其他东西放回去,然后写一个测试来确认这是按预期工作的。