Как использовать `std :: string` в качестве ключа для` QHash`? - PullRequest
0 голосов
/ 25 января 2020

Я хочу использовать std::string в качестве ключа QHash:

QHash<std::string, QString> m_hash;
m_hash.insert("ABC", "DEF");

Я реализовал требуемую qHa sh:

inline qHash(const std::string& key, uint seed = 0)
{
  qHash(QByteArray::fromRawData(key.data(), key.length()), seed);
}

Все компилируется правильно используя MSV C, но g cc генерирует следующую ошибку:

ошибка: не соответствует функция для вызова qHash(const std::__cxx11::basic_string<char>&)

Как мне решить эту проблему ISSE

1 Ответ

0 голосов
/ 25 января 2020

Короткий ответ

Определите функцию qHash внутри пространства имен std.

Длинный ответ

Как указано в этом отчете об ошибке , необходимо определить функцию qHash внутри пространства имен std::string:

Это задокументировано в стандарте C ++. Это называется Аргумент-зависимый поиск . В нем говорится, что поиск неквалифицированного qHa sh (T) найдет его в пространстве имен T.

Итак, правильное определение требуемого qHash будет:

namespace std
{
  inline qHash(const std::string& key, uint seed = 0)
  {
    qHash(QByteArray::fromRawData(key.data(), key.length()), seed);
  }
}

Это также упоминается в документации Qt:

Тип ключа QHa sh имеет дополнительные требования, помимо того, что он является назначаемым типом данных: он должен предоставлять оператор == (), и также должна быть функция qHa sh () в пространстве имен типа , которая возвращает значение ha sh для аргумента типа ключа.

Дальнейшее чтение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...