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:Qt5.14.2msvc2017_64includeQtCore/qhashfunctions.h(118): error C2665: 'qHash': 24 个重载中没有一个可以转换所有参数类型 C:Qt5.14.2msvc2017_64 includeQtCore/qlocale.h(62): 注意:可能是 'uint qHash(const QLocale &,uint) noexcept' C:Qt5.14.2msvc2017_64includeQtCore/qregexp.h(56):注意:或
正在使用 [ T=Test ] C:Usersvlad.dumitruCLionProjectsTestmain.cpp(11) 进行编译:注意:请参阅对正在编译的类模板实例“QSet”的引用 C:Qt5.14.2 msvc2017_64includeQtCore/qhashfunctions.h(118):错误C2056:非法表达式NMAKE:致命错误U1077:'C:PROGRA~2MICROS~22017BUILDT~1VCToolsMSVC1416~ 1.270binHostx64x64cl.exe' : 返回码 '0x2' 停止。NMAKE: 致命错误 U1077: '"C:Program Files (x86)Microsoft Visual Studio2017BuildToolsVCToolsMSVC14.16.27023binHostX64x64nmake.exe"': 返回代码 ' 0x2' 停止。NMAKE: 致命错误 U1077: '"C:Program Files (x86)Microsoft Visual Studio2017BuildToolsVCToolsMSVC14.16.27023binHostX64x64nmake.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;
}
};
我确实编写了我需要的那 2 个函数,但现在出现了一个新错误:
错误 C2664:“uint Test::qHash(const Test &,uint)”:无法将参数 1 从“const int”转换为“const Test &”
我无法调用,qHash(key.a, seed)因为“对类型 'const Test' 的引用无法绑定到类型为 'const int' 的左值”
回答
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的文档页面
,为了完整起见,我将其链接到此处,但不清楚此要求。