Qhash of 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' в качестве аргумента 'this' для QHash::iterator QHash::insert(const Key&, const T&) [with Key = int; T = int]'отбрасывает квалификаторы [-fpermissive] motifByCell2seq->value(motif).value(cell).insert(si,1);

Даже когда я изменил эту строку на следующую, по-прежнему возникает ошибка

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

Не могли бы вы помочь мне выяснить проблему?

1 ответ

Решение

Короткая версия: The value() метод возвращает константу, поэтому пытается сделать value().insert() пытается изменить это постоянное значение. operator[] может вернуть const и ясно, что в этом случае он решит это сделать. Если вы назначите motifByCell2seq[motif][cell] во временную переменную, вы можете заставить неконстантный operator[],

Длинная версия: в качестве стратегии для решения этой проблемы (то есть, что я сделал, чтобы получить короткую версию выше), я бы разбил проблемную строку на части, назначив каждому свою временную переменную.

Итак, сначала стоит упростить. Например, строка флага bool и флаг оператора if необходимы для воссоздания ошибки, поэтому закомментируйте их сейчас. То же самое для оператора if, который находится первым в цикле for.

Итак, в настоящее время я уменьшил проблему до:

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);

И затем, конечно, отложите другие вещи, которые я удалил, и затем напишите тест, чтобы подтвердить, что это работает как ожидалось.

Другие вопросы по тегам