【问题标题】:Qhash of Qhash reports errorQhash的Qhash报错
【发布时间】:2015-03-07 22:52:58
【问题描述】:

我用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::iterator QHash::insert(const Key&, const T&) [with Key = int; 的 'this' 参数传递T = int]' 丢弃限定符 [-fpermissive] motifByCell2seq->value(motif).value(cell).insert(si,1);

即使我把这行改成下面的,还是有错误

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

你能帮我找出问题吗?

【问题讨论】:

    标签: c++ qt qhash


    【解决方案1】:

    短版: value() 方法返回一个常量,因此尝试执行 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);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多