Russian Qt Forum
Ноябрь 25, 2024, 12:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] QHash<std::pair<std::string, std::string>, int> hash как скомпилить?  (Прочитано 5118 раз)
vintik
Гость
« : Май 05, 2013, 21:22 »

Всем привет!
Не могу понять как скомпилить сабж, может знает кто?
Почему не юзаю QHash<QPair<QString, QString>, int> - требование к интерфейсу.

код примерно такой в some_class.h
Код:
template <typename T1, typename T2> inline uint qHash(const std::pair<T1, T2> &key)
{
    return qHash("unique-bla-bla-bla");
}

class some_class
{
    QHash<std::pair<std::string, std::string>, int> hash_;
};

При попытке инсерта
Код:
hash_.insert(std::make_pair("xxx", "yyy"), 10);

в момент компиляции получаю такую ошибку
/usr/include/qt4/QtCore/qhash.h:880:24:
        error: no matching function for call to ‘qHash(const std::pair<std::basic_string<char>, std::basic_string<char> >&)’
/usr/include/qt4/QtCore/qhash.h:880:24:
        note: candidates are:  <bla-bla-bla>

                                                                    
Решение подсказал alex312 - функция генерящая хэш, должна быть объявлена до включения заголовка QHash
Примерно так:
Код:
template <typename T1, typename T2> inline uint qHash(const std::pair<T1, T2> &key);

#include <QHash>

template <typename T1, typename T2> inline uint qHash(const std::pair<T1, T2> &key)
{
    return qHash("unique-bla-bla-bla");
}

Кстати, тут важно отметить, что для компиляции я использовал g++4.7.
В visual studio, где код компилился позднее, такой проблемы не обнаружилось. Вероятно, дело в том что их компилятор чуть более лоялен.
« Последнее редактирование: Июнь 27, 2013, 16:46 от vintik » Записан
VPS
Гость
« Ответ #1 : Май 05, 2013, 22:09 »

Вот из документации:
The key type of a QHash must provide operator==() and a global hash function called qHash() (see the related non-member functions).

Соответственно компилятор говорит, что не знает глобальной функции "qHash" с типом "std::pair"...
« Последнее редактирование: Май 06, 2013, 07:13 от vps » Записан
vintik
Гость
« Ответ #2 : Май 05, 2013, 22:22 »

Вот из документации:
The key type of a QHash must provide operator==() and a global hash function called qHash() (see the related non-member functions).

Соответственно компилятор говорит, что не знает глобальной функции "qHash" с типом "std::pair"...
Поэтому её надо реализовать самому.

ну так в приведённом мной примере есть эта самая функция
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #3 : Май 05, 2013, 22:32 »

ну так в приведённом мной примере есть эта самая функция
эта функция должна быть обьявлена до включения заголовка QHash
Записан
vintik
Гость
« Ответ #4 : Май 05, 2013, 23:29 »

ну так в приведённом мной примере есть эта самая функция
эта функция должна быть обьявлена до включения заголовка QHash

Твоя правда, спасибо! Вопрос решён
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.06 секунд. Запросов: 23.