C++ 如何使用'std::string'作为'QHash'的键?

C++ 如何使用'std::string'作为'QHash'的键?,c++,qt,qhash,C++,Qt,Qhash,我想使用std::string作为QHash的键: QHash<std::string, QString> m_hash; m_hash.insert("ABC", "DEF"); 使用MSVC可以正确编译所有内容,但gcc会生成以下错误: 错误:调用qHash(const std::\uuucxx11::basic\ustring&)时没有匹配的函数。 我应该如何解决这个问题?简短回答 在std名称空间中定义qHash函数可能会解决编译器错误,但因此,这是不允许的 一种解决方法是

我想使用
std::string
作为
QHash
的键:

QHash<std::string, QString> m_hash;
m_hash.insert("ABC", "DEF");
使用MSVC可以正确编译所有内容,但gcc会生成以下错误:

错误:调用
qHash(const std::\uuucxx11::basic\ustring&)时没有匹配的函数。


我应该如何解决这个问题?

简短回答

std
名称空间中定义
qHash
函数可能会解决编译器错误,但因此,这是不允许的

一种解决方法是将
std::string
包装在助手类中:

Qt文档中也提到了这一点:

QHash的键类型除了作为可分配的数据类型之外还有其他要求:它必须提供运算符==(),并且在类型的命名空间中还必须有一个QHash()函数,该函数为键类型的参数返回哈希值

然而,因此,人们只能使用非理想的解决方法

进一步阅读

  • 关于
    qHash
    重载的有趣文章:
inline qHash(const std::string& key, uint seed = 0)
{
  qHash(QByteArray::fromRawData(key.data(), key.length()), seed);
}
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);
}
namespace std
{
  inline qHash(const std::string& key, uint seed = 0)
  {
    qHash(QByteArray::fromRawData(key.data(), key.length()), seed);
  }
}