QSet:qHash 和自定义类出错

Posted

技术标签:

【中文标题】QSet:qHash 和自定义类出错【英文标题】:QSet: error with qHash and custom class 【发布时间】:2015-09-16 19:33:41 【问题描述】:

我想创建一个我想在我的程序中使用的QSet<Tag>Tag 是我的自定义类。

当我构建代码时,我收到关于 qHash 重载的 gcc 错误:

Exercise.cpp.o
In file included from /opt/Qt/5.5/gcc_64/include/QtCore/qglobal.h:74:0,
                 from /opt/Qt/5.5/gcc_64/include/QtCore/qchar.h:37,
                 from /opt/Qt/5.5/gcc_64/include/QtCore/qstring.h:41,
                 from /opt/Qt/5.5/gcc_64/include/QtCore/QString:1,
                 from /src/wmathtest/LaTeXText.h:4,
                 from /src/wmathtest/Exercise.h:4,
                 from /src/wmathtest/Exercise.cpp:1:
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h: In instantiation of ‘uint qHash(const T&, uint) [with T = WMathTest::Tag; uint = unsigned int]’:
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:952:32:   required from ‘QHash<Key, T>::Node** QHash<Key, T>::findNode(const Key&, uint*) const [with Key = WMathTest::Tag; T = QHashDummyValue; QHash<Key, T>::Node = QHashNode<WMathTest::Tag, QHashDummyValue>; uint = unsigned int]’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:808:36:   required from ‘QHash<Key, T>::iterator QHash<Key, T>::insert(const Key&, const T&) [with Key = WMathTest::Tag; T = QHashDummyValue]’
/opt/Qt/5.5/gcc_64/include/QtCore/qset.h:188:94:   required from ‘QSet<T>::iterator QSet<T>::insert(const T&) [with T = WMathTest::Tag]’
/src/wmathtest/Exercise.cpp:22:22:   required from here
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:103:5: error: no matching function for call to ‘qHash(const WMathTest::Tag&)’
     Q_DECL_NOEXCEPT_EXPR(noexcept(qHash(t)))
     ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:103:5: note: candidates are:
In file included from /opt/Qt/5.5/gcc_64/include/QtCore/qset.h:37:0,
                 from /opt/Qt/5.5/gcc_64/include/QtCore/QSet:1,
                 from /src/wmathtest/Tag.h:5,
                 from /src/wmathtest/Exercise.h:5,
                 from /src/wmathtest/Exercise.cpp:1:
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:65:52: note: constexpr uint qHash(char, uint)
 Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(char key, uint seed = 0) Q_DECL_NOTHROW  return uint(key) ^ seed; 
                                                    ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:65:52: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘char’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:66:52: note: constexpr uint qHash(uchar, uint)
 Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(uchar key, uint seed = 0) Q_DECL_NOTHROW  return uint(key) ^ seed; 
                                                    ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:66:52: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘uchar aka unsigned char’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:67:52: note: constexpr uint qHash(signed char, uint)
 Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(signed char key, uint seed = 0) Q_DECL_NOTHROW  return uint(key) ^ seed; 
                                                    ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:67:52: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘signed char’
In file included from /opt/Qt/5.5/gcc_64/include/QtCore/qset.h:37:0,
                 from /opt/Qt/5.5/gcc_64/include/QtCore/QSet:1,
                 from /src/wmathtest/Tag.h:5,
                 from /src/wmathtest/Exercise.h:5,
                 from /src/wmathtest/Exercise.cpp:1:
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:68:52: note: constexpr uint qHash(ushort, uint)
 Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(ushort key, uint seed = 0) Q_DECL_NOTHROW  return uint(key) ^ seed; 
                                                    ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:68:52: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘ushort aka short unsigned int’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:69:52: note: constexpr uint qHash(short int, uint)
 Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(short key, uint seed = 0) Q_DECL_NOTHROW  return uint(key) ^ seed; 
                                                    ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:69:52: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘short int’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:70:52: note: constexpr uint qHash(uint, uint)
 Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(uint key, uint seed = 0) Q_DECL_NOTHROW  return key ^ seed; 
                                                    ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:70:52: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘uint aka unsigned int’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:71:52: note: constexpr uint qHash(int, uint)
 Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(int key, uint seed = 0) Q_DECL_NOTHROW  return uint(key) ^ seed; 
                                                    ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:71:52: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘int’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:72:52: note: constexpr uint qHash(ulong, uint)
 Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(ulong key, uint seed = 0) Q_DECL_NOTHROW
                                                    ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:72:52: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘ulong aka long unsigned int’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:78:52: note: constexpr uint qHash(long int, uint)
 Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(long key, uint seed = 0) Q_DECL_NOTHROW  return qHash(ulong(key), seed); 
                                                    ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:78:52: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘long int’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:79:52: note: constexpr uint qHash(quint64, uint)
 Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(quint64 key, uint seed = 0) Q_DECL_NOTHROW
                                                    ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:79:52: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘quint64 aka long long unsigned int’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:83:52: note: constexpr uint qHash(qint64, uint)
 Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(qint64 key, uint seed = 0) Q_DECL_NOTHROW  return qHash(quint64(key), seed); 
                                                    ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:83:52: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘qint64 aka long long int’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:84:42: note: uint qHash(float, uint)
 Q_CORE_EXPORT Q_DECL_CONST_FUNCTION uint qHash(float key, uint seed = 0) Q_DECL_NOTHROW;
                                          ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:84:42: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘float’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:85:42: note: uint qHash(double, uint)
 Q_CORE_EXPORT Q_DECL_CONST_FUNCTION uint qHash(double key, uint seed = 0) Q_DECL_NOTHROW;
                                          ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:85:42: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘double’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:87:42: note: uint qHash(long double, uint)
 Q_CORE_EXPORT Q_DECL_CONST_FUNCTION uint qHash(long double key, uint seed = 0) Q_DECL_NOTHROW;
                                          ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:87:42: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘long double’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:89:52: note: constexpr uint qHash(QChar, uint)
 Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(const QChar key, uint seed = 0) Q_DECL_NOTHROW  return qHash(key.unicode(), seed); 
                                                    ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:89:52: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘QChar’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:90:41: note: uint qHash(const QByteArray&, uint)
 Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(const QByteArray &key, uint seed = 0) Q_DECL_NOTHROW;
                                         ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:90:41: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘const QByteArray&’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:91:41: note: uint qHash(const QString&, uint)
 Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(const QString &key, uint seed = 0) Q_DECL_NOTHROW;
                                         ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:91:41: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘const QString&’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:92:41: note: uint qHash(const QStringRef&, uint)
 Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(const QStringRef &key, uint seed = 0) Q_DECL_NOTHROW;
                                         ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:92:41: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘const QStringRef&’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:93:41: note: uint qHash(const QBitArray&, uint)
 Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(const QBitArray &key, uint seed = 0) Q_DECL_NOTHROW;
                                         ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:93:41: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘const QBitArray&’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:94:41: note: uint qHash(QLatin1String, uint)
 Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(QLatin1String key, uint seed = 0) Q_DECL_NOTHROW;
                                         ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:94:41: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘QLatin1String’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:98:32: note: template<class T> uint qHash(const T*, uint)
 template <class T> inline uint qHash(const T *key, uint seed = 0) Q_DECL_NOTHROW
                                ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:98:32: note:   template argument deduction/substitution failed:
In file included from /opt/Qt/5.5/gcc_64/include/QtCore/qglobal.h:74:0,
                 from /opt/Qt/5.5/gcc_64/include/QtCore/qchar.h:37,
                 from /opt/Qt/5.5/gcc_64/include/QtCore/qstring.h:41,
                 from /opt/Qt/5.5/gcc_64/include/QtCore/QString:1,
                 from /src/wmathtest/LaTeXText.h:4,
                 from /src/wmathtest/Exercise.h:4,
                 from /src/wmathtest/Exercise.cpp:1:
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:103:5: note:   mismatched types ‘const T*’ and ‘WMathTest::Tag’
     Q_DECL_NOEXCEPT_EXPR(noexcept(qHash(t)))
     ^
src/wmathtest/CMakeFiles/wmathtest.dir/build.make:146: recipe for target 'src/wmathtest/CMakeFiles/wmathtest.dir/Exercise.cpp.o' failed
make[2]: *** [src/wmathtest/CMakeFiles/wmathtest.dir/Exercise.cpp.o] Error 1
CMakeFiles/Makefile2:160: recipe for target 'src/wmathtest/CMakeFiles/wmathtest.dir/all' failed
make[1]: *** [src/wmathtest/CMakeFiles/wmathtest.dir/all] Error 2
Makefile:76: recipe for target 'all' failed
    Exercise.cpp.o
In file included from /opt/Qt/5.5/gcc_64/include/QtCore/qglobal.h:74:0,
                 from /opt/Qt/5.5/gcc_64/include/QtCore/qchar.h:37,
                 from /opt/Qt/5.5/gcc_64/include/QtCore/qstring.h:41,
                 from /opt/Qt/5.5/gcc_64/include/QtCore/QString:1,
                 from /wmathtest/LaTeXText.h:4,
                 from /src/wmathtest/Exercise.h:4,
                 from /wmathtest/Exercise.cpp:1:
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h: In instantiation of ‘uint qHash(const T&, uint) [with T = WMathTest::Tag; uint = unsigned int]’:
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:952:32:   required from ‘QHash<Key, T>::Node** QHash<Key, T>::findNode(const Key&, uint*) const [with Key = WMathTest::Tag; T = QHashDummyValue; QHash<Key, T>::Node = QHashNode<WMathTest::Tag, QHashDummyValue>; uint = unsigned int]’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:808:36:   required from ‘QHash<Key, T>::iterator QHash<Key, T>::insert(const Key&, const T&) [with Key = WMathTest::Tag; T = QHashDummyValue]’
/opt/Qt/5.5/gcc_64/include/QtCore/qset.h:188:94:   required from ‘QSet<T>::iterator QSet<T>::insert(const T&) [with T = WMathTest::Tag]’
/wmathtest/Exercise.cpp:22:22:   required from here
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:103:5: error: no matching function for call to ‘qHash(const WMathTest::Tag&)’
     Q_DECL_NOEXCEPT_EXPR(noexcept(qHash(t)))
     ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:103:5: note: candidates are:
In file included from /opt/Qt/5.5/gcc_64/include/QtCore/qset.h:37:0,
                 from /opt/Qt/5.5/gcc_64/include/QtCore/QSet:1,
                 from /wmathtest/Tag.h:5,
                 from /wmathtest/Exercise.h:5,
                 from /wmathtest/Exercise.cpp:1:
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:65:52: note: constexpr uint qHash(char, uint)
 Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(char key, uint seed = 0) Q_DECL_NOTHROW  return uint(key) ^ seed; 
                                                    ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:65:52: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘char’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:66:52: note: constexpr uint qHash(uchar, uint)
 Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(uchar key, uint seed = 0) Q_DECL_NOTHROW  return uint(key) ^ seed; 
                                                    ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:66:52: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘uchar aka unsigned char’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:67:52: note: constexpr uint qHash(signed char, uint)
 Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(signed char key, uint seed = 0) Q_DECL_NOTHROW  return uint(key) ^ seed; 
                                                    ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:67:52: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘signed char’
In file included from /opt/Qt/5.5/gcc_64/include/QtCore/qset.h:37:0,
                 from /opt/Qt/5.5/gcc_64/include/QtCore/QSet:1,
                 from /home/daniele/projects/wmathtestgenerator/src/wmathtest/Tag.h:5,
                 from /Exercise.h:5,
                 from /wmathtest/Exercise.cpp:1:
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:68:52: note: constexpr uint qHash(ushort, uint)
 Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(ushort key, uint seed = 0) Q_DECL_NOTHROW  return uint(key) ^ seed; 
                                                    ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:68:52: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘ushort aka short unsigned int’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:69:52: note: constexpr uint qHash(short int, uint)
 Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(short key, uint seed = 0) Q_DECL_NOTHROW  return uint(key) ^ seed; 
                                                    ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:69:52: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘short int’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:70:52: note: constexpr uint qHash(uint, uint)
 Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(uint key, uint seed = 0) Q_DECL_NOTHROW  return key ^ seed; 
                                                    ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:70:52: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘uint aka unsigned int’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:71:52: note: constexpr uint qHash(int, uint)
 Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(int key, uint seed = 0) Q_DECL_NOTHROW  return uint(key) ^ seed; 
                                                    ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:71:52: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘int’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:72:52: note: constexpr uint qHash(ulong, uint)
 Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(ulong key, uint seed = 0) Q_DECL_NOTHROW
                                                    ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:72:52: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘ulong aka long unsigned int’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:78:52: note: constexpr uint qHash(long int, uint)
 Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(long key, uint seed = 0) Q_DECL_NOTHROW  return qHash(ulong(key), seed); 
                                                    ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:78:52: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘long int’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:79:52: note: constexpr uint qHash(quint64, uint)
 Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(quint64 key, uint seed = 0) Q_DECL_NOTHROW
                                                    ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:79:52: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘quint64 aka long long unsigned int’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:83:52: note: constexpr uint qHash(qint64, uint)
 Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(qint64 key, uint seed = 0) Q_DECL_NOTHROW  return qHash(quint64(key), seed); 
                                                    ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:83:52: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘qint64 aka long long int’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:84:42: note: uint qHash(float, uint)
 Q_CORE_EXPORT Q_DECL_CONST_FUNCTION uint qHash(float key, uint seed = 0) Q_DECL_NOTHROW;
                                          ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:84:42: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘float’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:85:42: note: uint qHash(double, uint)
 Q_CORE_EXPORT Q_DECL_CONST_FUNCTION uint qHash(double key, uint seed = 0) Q_DECL_NOTHROW;
                                          ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:85:42: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘double’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:87:42: note: uint qHash(long double, uint)
 Q_CORE_EXPORT Q_DECL_CONST_FUNCTION uint qHash(long double key, uint seed = 0) Q_DECL_NOTHROW;
                                          ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:87:42: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘long double’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:89:52: note: constexpr uint qHash(QChar, uint)
 Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(const QChar key, uint seed = 0) Q_DECL_NOTHROW  return qHash(key.unicode(), seed); 
                                                    ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:89:52: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘QChar’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:90:41: note: uint qHash(const QByteArray&, uint)
 Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(const QByteArray &key, uint seed = 0) Q_DECL_NOTHROW;
                                         ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:90:41: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘const QByteArray&’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:91:41: note: uint qHash(const QString&, uint)
 Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(const QString &key, uint seed = 0) Q_DECL_NOTHROW;
                                         ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:91:41: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘const QString&’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:92:41: note: uint qHash(const QStringRef&, uint)
 Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(const QStringRef &key, uint seed = 0) Q_DECL_NOTHROW;
                                         ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:92:41: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘const QStringRef&’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:93:41: note: uint qHash(const QBitArray&, uint)
 Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(const QBitArray &key, uint seed = 0) Q_DECL_NOTHROW;
                                         ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:93:41: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘const QBitArray&’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:94:41: note: uint qHash(QLatin1String, uint)
 Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(QLatin1String key, uint seed = 0) Q_DECL_NOTHROW;
                                         ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:94:41: note:   no known conversion for argument 1 from ‘const WMathTest::Tag’ to ‘QLatin1String’
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:98:32: note: template<class T> uint qHash(const T*, uint)
 template <class T> inline uint qHash(const T *key, uint seed = 0) Q_DECL_NOTHROW
                                ^
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:98:32: note:   template argument deduction/substitution failed:
In file included from /opt/Qt/5.5/gcc_64/include/QtCore/qglobal.h:74:0,
                 from /opt/Qt/5.5/gcc_64/include/QtCore/qchar.h:37,
                 from /opt/Qt/5.5/gcc_64/include/QtCore/qstring.h:41,
                 from /opt/Qt/5.5/gcc_64/include/QtCore/QString:1,
                 from /home/daniele/projects/wmathtestgenerator/src/wmathtest/LaTeXText.h:4,
                 from /home/daniele/projects/wmathtestgenerator/src/wmathtest/Exercise.h:4,
                 from /thtest/Exercise.cpp:1:
/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:103:5: note:   mismatched types ‘const T*’ and ‘WMathTest::Tag’
     Q_DECL_NOEXCEPT_EXPR(noexcept(qHash(t)))
     ^
src/wmathtest/CMakeFiles/wmathtest.dir/build.make:146: recipe for target 'src/wmathtest/CMakeFiles/wmathtest.dir/Exercise.cpp.o' failed
make[2]: *** [src/wmathtest/CMakeFiles/wmathtest.dir/Exercise.cpp.o] Error 1
CMakeFiles/Makefile2:160: recipe for target 'src/wmathtest/CMakeFiles/wmathtest.dir/all' failed
make[1]: *** [src/wmathtest/CMakeFiles/wmathtest.dir/all] Error 2
Makefile:76: recipe for target 'all' failed

我已经为该类创建了类,operator==qHash。然后我为班级创建了一个typedef,但这不起作用。

我做错了什么?

标签.h

#ifndef WMATHTEST_TAG_H_
#define WMATHTEST_TAG_H_

#include <QString>
#include <QSet>

namespace WMathTest 

class Tag 

public:

    Tag() = default;
    Tag(const QString &text);
    Tag(const Tag &tag) = default;
    virtual ~Tag() = default;
    void setText(const QString &text);
    const QString& getText() const;
    bool operator==(const Tag &other);

private:

QString m_text;
;

 // namespace WMathTest


inline uint qHash(const WMathTest::Tag &tag, uint seed) 
    return qHash(tag.getText(), seed);


typedef QSet<WMathTest::Tag> TagList;

#endif // !WMATHTEST_TAG_H_

标签.cpp

#include "wmathtest/Tag.h"

namespace WMathTest 

///////////////////////////////////////////////////////////////////////////////
// PUBLIC SECTION                                                            //
///////////////////////////////////////////////////////////////////////////////

Tag::Tag(const QString &text) :
    m_text(text) 



void Tag::setText(const QString &text) 
    m_text = text;


const QString& Tag::getText() const 
    return m_text;


bool Tag::operator==(const Tag &other) 
    return m_text == other.m_text;


 // namespace WMathTest

练习.h

#ifndef WMATHTEST_EXERCISE_H_
#define WMATHTEST_EXERCISE_H_

#include "wmathtest/LaTeXText.h"
#include "wmathtest/Tag.h"
#include <QString>

namespace WMathTest 

class Exercise 

public:

    Exercise() = default;
    virtual ~Exercise() = default;
    void setID(const QString &id);
    void setProblem(const LaTeXText &problem);
    void setSolution(const LaTeXText &solution);
    void addArgumentTag(const Tag &tag);
    void addArgumentTag(const QString &tag);
    QString getID() const;
    LaTeXText getProblem() const;
    LaTeXText getSolution() const;
    const TagList& getArgumentTagList() const;

private:

    QString m_id;
    LaTeXText m_problem;
    LaTeXText m_solution;
    TagList m_tagList;
;

 // namespace WMathTest

#endif // !WMATHTEST_EXERCISE_H_

练习.cpp

#include "wmathtest/Exercise.h"

namespace WMathTest 

///////////////////////////////////////////////////////////////////////////////
// PUBLIC SECTION                                                            //
///////////////////////////////////////////////////////////////////////////////

void Exercise::setID(const QString &id) 
    m_id = id;


void Exercise::setProblem(const LaTeXText &problem) 
    m_problem = problem;


void Exercise::setSolution(const LaTeXText &solution) 
    m_solution = solution;


void Exercise::addArgumentTag(const Tag &tag) 
    m_tagList.insert(tag);


void Exercise::addArgumentTag(const QString &tag) 
    m_tagList.insert(Tag(tag));


QString Exercise::getID() const 
    return m_id;


LaTeXText Exercise::getProblem() const 
    return m_problem;


LaTeXText Exercise::getSolution() const 
    return m_solution;


const TagList& Exercise::getArgumentTagList() const 
    return m_tagList;


 // namespace WMathTest

【问题讨论】:

似乎错误“/opt/Qt/5.5/gcc_64/include/QtCore/qhash.h:103:5: error: no matching function for call to 'qHash(const WMathTest::Tag& )'" 出现是因为您将 qHash 定义为“inline uint qHash(const WMathTest::Tag &tag, uint seed)”,但 QSet 希望将其定义为“inline uint qHash(const WMathTest::Tag &tag)” 我也与inline uint qHash(const WMathTest::Tag &amp;tag)return qHash(tag.getText()); 获得了类似的错误,正如我在文档doc.qt.io/qt-5/qhash.html#qhash 中看到的那样,我已经使用了它们两个 【参考方案1】:

哈希是一元函数(仅一个参数),它是数学意义上的函数(针对特定参数返回相同的值,并将返回完整的参数集的有效值)。

哈希函数有一个重要条件必须始终满足才能正常工作:如果两个对象被视为相等,则该对象的哈希值也必须相等。因此,例如,如果您以字符串为键的不区分大小写的容器,则必须提供不区分大小写的哈希函数。

请注意qHash functions you are see in documentation: seed 的附加参数始终具有默认值!所以这个函数可以用单个参数调用!这个参数只是一个选项,让您在为复杂类型构建自定义哈希函数时有机会调整哈希函数。

像这样修复你的代码:

inline uint qHash(const WMathTest::Tag &tag) 
    return qHash(tag.getText(), 0xa03f); // arbitrary value

或者像这样:

inline uint qHash(const WMathTest::Tag &tag, uint seed = 0) 
    return qHash(tag.getText(), seed^0xa03f);

如果更复杂的类型哈希函数可能如下所示(示例为什么种子可能有用):

inline uint qHash(const DoubleStringValue &tag, uint seed = 0) 
    return qHash(tag.firstText(), seed^0xa03f)^qHash(tag.secondText(), seed^0x17a317a3);

请注意,如果有两个 DoubleStringValue 对象,其中 firstTextsecondText 被翻转,则它们的哈希值将不同。

我建议阅读一些文档,了解具有散列函数的容器如何工作,以及为什么它们比其他解决方案(例如红黑树)更快。

【讨论】:

在我的函数中,我将return qHash(tag.getText()); 替换为return qHash(tag.getText(), 0xa3e); 并且我得到了同样的错误。在文档中写到我可以声明uint qHash(const K &amp;key); 并且我看到QStringqHash 被声明为uint qt_hash(const QString &amp;key) Q_DECL_NOTHROW 所以我在我的代码中看不到任何编程错误,但显然有一个因为它不起作用,即使我按照你说的做(我之前已经做过)。根据qhash.h 看来,我不需要为 QString 指定种子,因为有一个默认值。 @Jepessen 你有没有用种子的默认值声明它?你应该。 是的,我已经用默认值声明了函数【参考方案2】:

我自己找到了解决方案。显然这是我的错误,但与我的 qHash 实现无关。

我在operator== 声明中犯了一个错误:

bool operator==(const Tag &other);

声明缺少const 限定符。应该是

bool operator==(const Tag &other) const;

【讨论】:

以上是关于QSet:qHash 和自定义类出错的主要内容,如果未能解决你的问题,请参考以下文章

Qt6STL-QSet分析

XAML和自定义类

XAML和自定义类

XAML和自定义类

Spring Security 自定义 UserDetailsS​​ervice 和自定义 User 类

我们如何区分 SDK 类对象和自定义类对象?