QSet добавить настраиваемый объект

У меня следующий класс

      class Test{
    int a;
    int b;
};

и все, что я хочу, это иметь QSet<Test> куда я вставлю несколько тестовых объектов.

      int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);
    QSet<Test> setTest;
    setTest.insert(Test());
    return QCoreApplication::exec();
}

Проблема в том, что по какой-то причине у меня появляется следующая ошибка, и я не знаю, почему и как ее исправить.

C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qhashfunctions.h(118): ошибка C2665: 'qHash': ни одна из 24 перегрузок не смогла преобразовать все типы аргументов C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qlocale.h(62): примечание: может быть 'uint qHash(const QLocale &,uint) noexcept' C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qregexp.h(56): примечание: или
'uint qHash(const QRegExp &,uint) noexcept' C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qhashfunctions.h(108): note: или 'uint qHash(std :: nullptr_t,uint) noexcept' C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qhashfunctions.h(105): note: или 'uint qHash(QLatin1String,uint) noexcept' C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qhashfunctions.h(104): note: или 'uint qHash(const QBitArray &,uint) noexcept' C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qhashfunctions.h(103): note: или 'uint qHash(QStringView,uint) noexcept 'C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qhashfunctions.h(101): note: или' uint qHash(const QStringRef &,uint) noexcept 'C: \ Qt \ 5.14 .2 \ msvc2017_64 \ include \ QtCore /qhashfunctions.h(100): note: или 'uint qHash(const QString &,uint) noexcept' C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qhashfunctions.h(98): note: или 'uint qHash(const QByteArray &,uint) noexcept' C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qhashfunctions.h(97): note: или 'uint qHash(const QChar,uint) noexcept' C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qhashfunctions.h(95): note: или 'uint qHash(long double,uint) noexcept 'C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qhashfunctions.h(93): note: или' uint qHash(double,uint) noexcept 'C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qhashfunctions.h(92): note: или 'uint qHash(float,uint) noexcept' C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qhashfunctions.h(91): note: или 'uint qHash(qint64,uint) noexcept 'C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qhashfunctions.h(87): note: или' uint qHash(quint64,uint) noexcept 'C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qhashfunctions.h(86): note: или 'uint qHash(long,uint) noexcept' C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qhashfunctions.h(80): note: или 'uint qHash(ulong,uint) noexcept' C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qhashfunctions.h(79): note: или 'uint qHash(int,uint) noexcept' C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qhashfunctions.h(78): note: или 'uint qHash(uint,uint) noexcept' C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qhashfunctions. h (77): note: или 'uint qHash(short,uint) noexcept' C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qhashfunctions.h (76): note: или 'uint qHash(ushort, uint ) noexcept 'C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qhashfunctions.h (75): note: или' uint qHash(signed char,uint) noexcept 'C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qhashfunctions.h (74): примечание: или 'uint qHash(uchar,uint) noexcept 'C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qhashfunctions.h (73): note: или' uint qHash(char,uint) noexcept 'C: \ Qt \ 5.14 .2 \ msvc2017_64 \ include \ QtCore /qhashfunctions.h(118): примечание: при попытке сопоставить список аргументов '(const T)' с [T=Test] C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qhashfunctions.h (117): примечание: см. Ссылку на создание экземпляра шаблона функции uint qHash(const T &,uint) noexcept(), компилируемое с помощью [Key = Test, T=Test] C: \ Qt \ 5.14. 2 \ msvc2017_64 \ include \ QtCore /qhash.h(946): примечание: при компиляции функции-члена шаблона класса 'QHashNode<Key,T>**QHash<Key,T> :: findNode(const Key &,uint *) const 'с [Key=Test,T=QHashDummyValue] C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qhash.h(790): примечание: см. ссылку на создание экземпляра шаблона функции »QHashNode<Key,T>**QHash<Key,T> :: findNode(const Key &,uint *) const 'компилируется с помощью [Key=Test,T=QHashDummyValue] C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qhash.h(786): примечание: при компиляции функции-члена шаблона класса 'QHash<T,QHashDummyValue> :: iterator QHash<T,QHashDummyValue> :: insert (const Key &,const QHashDummyValue &)' с [ T=Test, Key = Test] C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qset.h(208): примечание: см. Ссылку на создание экземпляра шаблона функции QHash<T,QHashDummyValue> :: iterator QHash < T, QHashDummyValue> :: insert (const Key &, const QHashDummyValue &) 'компилируется с помощью [T=Test, Key = Test] C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qset.h (257) : note: см. ссылку на создание экземпляра шаблона класса QHash<T,QHashDummyValue>компилируется с помощью [T=Test] C: \ Users \ vlad.dumitru \ CLionProjects \ Test \ main.cpp (11): примечание: см. ссылку на компилируемый экземпляр шаблона класса 'QSet' C: \ Qt \ 5.14.2 \ msvc2017_64 \ include \ QtCore /qhashfunctions.h(118): ошибка C2056: недопустимое выражение NMAKE: фатальная ошибка U1077: 'C: \ PROGRA~ 2 \ MICROS~ 2 \ 2017 \ BUILDT~ 1 \ VC \ Tools \ MSVC \ 1416~1.270 \ bin \ Hostx64 \ x64 \ cl.exe ': код возврата' 0x2 'Stop. NMAKE: фатальная ошибка U1077: '"C: \ ProgramFiles (x86) \ Microsoft VisualStudio \ 2017 \ BuildTools \ VC \ Tools \ MSVC \ 14.16.27023 \ bin \ HostX64 \ x64 \ nmake.exe"': код возврата ' 0x2 'Стоп. NMAKE: фатальная ошибка U1077: '"C: \ ProgramFiles (x86) \ Microsoft VisualStudio \ 2017 \ BuildTools \ VC \ Tools \ MSVC \ 14.16.27023 \ bin \ HostX64 \ x64 \ nmake.exe"': код возврата ' 0x2 'Стоп. NMAKE: фатальная ошибка U1077: '"C:\ ProgramFiles (x86) \ Microsoft VisualStudio \ 2017 \ BuildTools \ VC \ Tools \ MSVC \ 14.16.27023 \ bin \ HostX64 \ x64 \ nmake.exe"': код возврата' 0x2 'Stop.

Кто-нибудь из вас знает, как я могу это исправить?

ОБНОВИТЬ:

      class Test {
    int a;
    int b;

    bool operator==(const Test &e1) const {
        return e1.a == a && e1.b == b;
    }

    uint qHash(const Test &key, uint seed) {
        return qHash(key.a, seed) ^ key.b;
    }
};

Я написал те 2 функции, которые мне нужны, но теперь получаю новую ошибку:

ошибка C2664: 'uint Test :: qHash(const Test &,uint)': невозможно преобразовать аргумент 1 из 'const int' в 'const Test &'

Я не могу назвать qHash(key.a, seed)потому что « Ссылка на тип 'const Test' не может быть привязана к lvalue типа 'const int' »

1 ответ

Решение

реализуется как QHash, поэтому ваш класс должен реализовывать operator==() и qHash() функция с одной из этих подписей

      uint qHash(K key);
uint qHash(const K &key);

uint qHash(K key, uint seed);
uint qHash(const K &key, uint seed);

Q иначе не сможет хешировать ваши данные.

Вы можете посмотреть официальный пример здесь
https://doc.qt.io/qt-5/qhash.html#qhash


Это страница документации о QSet https://doc.qt.io/qt-5/qset.html#details
Я привязываю его здесь для полноты, но это требование не совсем понятно.

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