etc:blog:q_multi_hash_map_qsharedpointer
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| etc:blog:q_multi_hash_map_qsharedpointer [2011/01/27 18:39] – vood | etc:blog:q_multi_hash_map_qsharedpointer [2011/01/27 21:30] (current) – kkv | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== | + | ====== |
| - | + | ||
| - | ==== Введение | + | |
| - | Библиотека Qt предоставляет множество удобных средств для разработки любых приложений, например api для взаимодействия с мобильными платформами или набор классов для GUI приложений. Сложно представить себе крупное приложение написанное без использования стандартных контейнеров (векторов, | + | |
| - | В данной статье речь пойдет об одной не совсем очевидной особенности совместного использования таких классов как | + | |
| + | ==== Введение ==== | ||
| + | Библиотека Qt предоставляет множество удобных средств для разработки приложений, | ||
| ==== Проблема ==== | ==== Проблема ==== | ||
| - | Рассмотрим небольшой пример, который | + | Впервые |
| + | <code bash> | ||
| + | In file included from / | ||
| + | from / | ||
| + | / | ||
| + | / | ||
| + | / | ||
| + | | ||
| + | / | ||
| + | / | ||
| + | / | ||
| + | / | ||
| + | </ | ||
| + | Больше | ||
| + | <code bash> | ||
| + | / | ||
| + | </ | ||
| + | так как сигнатура функиции uniqueKeys должна выглядеть | ||
| - | < | + | Дальнейшие изыскания позволили выяснить, |
| + | |||
| + | Рассмотрим небольшой пример, | ||
| + | < | ||
| #include < | #include < | ||
| #include < | #include < | ||
| Line 21: | Line 38: | ||
| int main(int argc,char** argv){ | int main(int argc,char** argv){ | ||
| - | QMultiMap< | + | QMultiMap< |
| - | int a=1,b=2; | + | int* a,*b; |
| - | QSharedPointer< | + | a=new int; |
| - | QSharedPointer< | + | b=new int; |
| - | map.insert(aa, | + | QSharedPointer< |
| - | map.insert(bb, | + | QSharedPointer< |
| - | map.insert(bb, | + | map.insert(aa, |
| + | map.insert(bb, | ||
| + | map.insert(bb, | ||
| QList< | QList< | ||
| - | printf(" | ||
| return 0; | return 0; | ||
| }</ | }</ | ||
| - | Если мы попытаемся скомпилировать данный пример | + | Если мы попытаемся скомпилировать данный пример, |
| - | < | + | < |
| In file included from / | In file included from / | ||
| from main.cpp:2: | from main.cpp:2: | ||
| - | / | + | / |
| - | main.cpp:18: | + | main.cpp:23: |
| - | / | + | / |
| / | / | ||
| / | / | ||
| Line 49: | Line 67: | ||
| / | / | ||
| / | / | ||
| - | / | + | / |
| - | / | + | / |
| - | / | + | / |
| - | / | + | / |
| - | main.cpp:15: | + | main.cpp:20: |
| - | / | + | / |
| / | / | ||
| / | / | ||
| Line 72: | Line 90: | ||
| из-за которой и происходит сбой компиляции. Вот так выглядит ее прототип в документации Qt [[http:// | из-за которой и происходит сбой компиляции. Вот так выглядит ее прототип в документации Qt [[http:// | ||
| <code text> | <code text> | ||
| - | Очевидно, | ||
| - | {{tag>}} | + | Очевидно, |
| + | Обратимся к описанию данной функции. Исходя из документации она возвращает список всех ключей в QMultiMap в порядке возрастания. Логично предположить, | ||
| + | Определим свой оператор сравнения следующим образом: | ||
| + | |||
| + | <code c++> | ||
| + | template <class T> | ||
| + | bool operator < | ||
| + | return a.data()< | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Если включить код данного оператора в код примера, | ||
| + | |||
| + | Проблема, | ||
| + | <code c++> | ||
| + | template <class T> | ||
| + | uint qHash(const QSharedPointer< | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Заключение ==== | ||
| + | |||
| + | Очевидно, | ||
| + | Описанная проблема устранена в новой версии Qt 4.7, которая входит в состав Qt SDK 1.1. Однако предложенное здесь решение остается актуальным, | ||
| + | |||
| + | {{tag>qt ovi QMultiMap QSharedPointer}} | ||
| ~~DISCUSSION~~ | ~~DISCUSSION~~ | ||
etc/blog/q_multi_hash_map_qsharedpointer.1296142763.txt.gz · Last modified: 2011/01/27 18:39 (external edit)