Записки программиста Программирование и не только

21Фев/120

QHash и структура в качестве ключа.

Тема легкая, но мне, почему-то далась достаточно напряжно.

Задача: использовать в качестве ключа QHash структуру.
Читаем документацию - для данной операции достаточно в структуре определить оператор "==" и написать глобальную функцию qHash для нашей структуры.

Решение:

struct MyStruct
{
    quint8 a1;
    quint8 a2;
    quint8 a3;
    quint8 a4;
    bool operator==(const MyStruct struc) const
    {
        return (a1 == struc.a1 &&
                a2 == struc.a2 &&
                a3 == struc.a3 &&
                a4 == struc.a4);
    }
};
uint qHash(const MyStruct &struc)
{
    //как-то вычисляем хеш
    //в моём случае в структуре содержалось 4 целых числа и я просто записал их в одно число со сдвигом
    uint result = struc.a1;

    result <<=(sizeof(quint8)*8);
    result = result|struc.a2;

    result <<=(sizeof(quint8)*8);
    result = result|struc.a3;

    result <<=(sizeof(quint8)*8);
    result = result|struc.a4;
    return result;
}

Использование:

QHash < MyStruct, QString > myQHash

Всё работает отлично.

А вот при попытке использовать еще одну структуру в качестве значения QHash

QHash < MyStruct, MyOtherStruct > myOtherQHash

При запросе значения по ключу - всё работает отлично, но при попытке получить ключ по значению получаем надпись:

no match for 'operator==' in 'i.QHash<Key, T>::const_iterator::value [with Key = MyStruct, T = MyOtherStruct]() == avalue'

Страшная надпись, не правда ли? :)

Причина - не хватает операции "==" во второй структуре. Добавляем её и всё работает.
Вот так.

struct, key, qhash

Метки записи: , Оставить комментарий
Комментарии (0) Пинги (0)

Пока нет комментариев.


Leave a comment

Нет обратных ссылок на эту запись.