Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: vintik от Май 05, 2013, 21:22



Название: [РЕШЕНО] QHash<std::pair<std::string, std::string>, int> hash как скомпилить?
Отправлено: 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, где код компилился позднее, такой проблемы не обнаружилось. Вероятно, дело в том что их компилятор чуть более лоялен.


Название: Re: QHash<std::pair<std::string, std::string>, int> hash как скомпилить?
Отправлено: VPS от Май 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"...


Название: Re: QHash<std::pair<std::string, std::string>, int> hash как скомпилить?
Отправлено: vintik от Май 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"...
Поэтому её надо реализовать самому.

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


Название: Re: QHash<std::pair<std::string, std::string>, int> hash как скомпилить?
Отправлено: alex312 от Май 05, 2013, 22:32
ну так в приведённом мной примере есть эта самая функция
эта функция должна быть обьявлена до включения заголовка QHash


Название: Re: QHash<std::pair<std::string, std::string>, int> hash как скомпилить?
Отправлено: vintik от Май 05, 2013, 23:29
ну так в приведённом мной примере есть эта самая функция
эта функция должна быть обьявлена до включения заголовка QHash

Твоя правда, спасибо! Вопрос решён