Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qhash的Qhash报告错误_C++_Qt_Qhash - Fatal编程技术网

C++ Qhash的Qhash报告错误

C++ Qhash的Qhash报告错误,c++,qt,qhash,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> *peakSequenc

我已经用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);
    }
    }
}
错误是:

错误:将“const QHash”作为“QHash::iterator QHash::insertconst Key&,const T&[with Key=int;T=int]”的“this”参数传递会丢弃限定符[-fppermissive] MotionByCell2Seq->valuemotif.valuecell.insertsi,1

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

motifByCell2seq[motif][cell].insert(si,1);
你能帮我找出问题吗?

简短版本: value方法返回一个常量,因此尝试执行value.insert就是试图修改该常量值。运算符[]可以返回一个常量,在这种情况下,它显然会选择这样做。如果将MotionByCell2Seq[motif][cell]赋值给临时变量,则可以强制使用非常量运算符[]

长版本: 作为解决这个问题的一种策略,也就是我为达到上面的简短版本所做的工作,我会将问题行分成几部分,将每一部分分配给它自己的临时变量

因此,首先它值得简化。例如,需要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);                                                                               
}
然后,当然,把我移除的其他东西放回原处,然后写一个测试来确认它是否按预期工作

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);                                                                                    
QHash<qint32, qint32> cellHash = (*motifByCell2seq)[motif][cell];
cellHash.insert(si,1);