[英]How to use std::string as key of QHash?
我想使用std::string
作为QHash
的键:
QHash<std::string, QString> m_hash;
m_hash.insert("ABC", "DEF");
我实现了所需的 qHash:
inline qHash(const std::string& key, uint seed = 0)
{
qHash(QByteArray::fromRawData(key.data(), key.length()), seed);
}
一切都使用 MSVC 正确编译,但 gcc 生成以下错误:
错误:没有匹配函数调用
qHash(const std::__cxx11::basic_string<char>&)
我应该如何解决这个问题?
开箱即用支持使用std::string
作为键,因为 Qt 现在使用std::hash
作为qHash
的后备。
简短的回答
在std
命名空间内定义qHash
函数可能会解决编译器错误,但将函数添加到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);
}
长答案
如本错误报告中所述,必须在std::string
的命名空间内定义qHash
函数:
这记录在 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
命名空间是未定义的行为。 因此,使用一种非理想的解决方法被卡住了。
进一步阅读
qHash
重载的有趣文章: https ://www.kdab.com/how-to-declare-a-qhash-overload/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.