0

我有以下课程

class Test{
    int a;
    int b;
};

我想要的只是有一个QSet<Test>我将插入一些 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):注意:或
正在使用 [ 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' 停止。NMAKE:致命错误 U1077:'"C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Tools\MSVC\14.16.27023\bin\HostX64\x64\nmake.exe"':返回代码' 0x2' 停止。NMAKE:致命错误 U1077:'"C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Tools\MSVC\14.16.27023\bin\HostX64\x64\nmake.exe"':返回代码' 0x2' 停止。NMAKE : 致命错误 U1077: '"C:

你们有谁知道我该如何解决这个问题?

更新:

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

我确实编写了我需要的这两个函数,但现在我遇到了一个新错误:

错误 C2664:“uint Test::qHash(const Test &,uint)”:无法将参数 1 从“const int”转换为“const Test &”

我不能调用,qHash(key.a, seed)因为“对'const Test'类型的引用无法绑定到'const int'类型的左值

4

1 回答 1

5

QSet被实现为QHash,因此您必须在您的类中实现 ,并operator==()在您的类的同一命名空间中实现一个qHash()函数。
它会使全局超载,qHash()并且可以具有这些签名之一

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

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

QtherwiseQSet将无法散列您的数据。

您可以在这里查看官方示例
https://doc.qt.io/qt-5/qhash.html#qhash


这是关于QSet https://doc.qt.io/qt-5/qset.html#details
的文档页面 ,为了完整起见,我将其链接到此处,但尚不清楚此要求。

于 2021-02-17T13:48:45.397 回答