Я написал функцию с 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);
Не могли бы вы помочь мне выяснить проблему?
Укороченная версия:
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);
И затем, конечно, отложите другие вещи, которые я удалил, и затем напишите тест, чтобы подтвердить, что это работает как ожидалось.