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&) [с ключом = int; T = int] ‘отбрасывает квалификаторы [-fpermissive] motifByCell2seq-> значение (мотив) .value (клетка) .Вставьте (си, 1);

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

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

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

0

Решение

Укороченная версия:
value() метод возвращает const, поэтому пытается сделать 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);

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

0

Другие решения


По вопросам рекламы [email protected]