简短的回答
std::string
开箱即用支持用作键,因为Qt现在std::hash
用作.qHash
在命名空间内定义qHash
函数std
可能会解决编译器错误,但将函数添加到std
命名空间是未定义的行为。所以,这是不允许的。
一种解决方法是包装std::string
在一个辅助类[1]中:
class MyHashString : public std::string {};
QHash<MyHashString, QString> m_hash;
m_hash.insert("ABC", "DEF");
inline qHash(const MyHashString& key, uint seed = 0)
{
qHash(QByteArray::fromRawData(key.data(), key.length()), seed);
}
长答案
如本错误报告qHash
中所述,必须在以下名称空间内定义函数std::string
:
这记录在 C++ 标准中。它称为参数依赖查找。它说搜索不合格的 qHash(T) 会在 T 的命名空间中找到它。
因此,所需的正确定义qHash
是:
namespace std
{
inline qHash(const std::string& key, uint seed = 0)
{
qHash(QByteArray::fromRawData(key.data(), key.length()), seed);
}
}
Qt 文档中也提到了它:
QHash 的键类型除了是可分配的数据类型之外还有其他要求:它必须提供 operator==(),并且类型的命名空间中还必须有一个 qHash() 函数,该函数返回键类型参数的哈希值.
但是,将函数添加到std
命名空间是未定义的行为。因此,使用一种非理想的解决方法被卡住了。
进一步阅读