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 revisionLast revisionBoth sides next revision | ||
etc:blog:q_multi_hash_map_qsharedpointer [2011/01/27 19:24] – vood | etc:blog:q_multi_hash_map_qsharedpointer [2011/01/27 21:14] – vood | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== QMultiMap+QSharedPointer ====== | ====== QMultiMap+QSharedPointer ====== | ||
+ | |||
+ | |||
==== Введение ==== | ==== Введение ==== | ||
- | Библиотека Qt предоставляет множество удобных средств для разработки | + | Библиотека Qt предоставляет множество удобных средств для разработки приложений, |
- | В данной статье речь пойдет об одной не совсем очевидной особенности совместного использования таких классов как QMultiMap и QSharedPointer. В качестве среды используется Ubuntu 10.04 с установленным Qt 4.6 . | + | |
Line 12: | Line 15: | ||
==== Проблема ==== | ==== Проблема ==== | ||
- | Рассмотрим небольшой пример, который | + | Впервые |
+ | <code bash> | ||
+ | In file included from / | ||
+ | from / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | </ | ||
+ | Больше | ||
+ | <code bash> | ||
+ | / | ||
+ | </ | ||
+ | так как сигнатура функиции uniqueKeys должна выглядеть | ||
- | < | + | Дальнейшие изыскания позволили выяснить, |
+ | |||
+ | Рассмотрим небольшой пример, | ||
+ | < | ||
#include < | #include < | ||
#include < | #include < | ||
Line 21: | Line 44: | ||
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< | ||
return 0; | return 0; | ||
Line 34: | Line 59: | ||
Если мы попытаемся скомпилировать данный пример, | Если мы попытаемся скомпилировать данный пример, | ||
- | < | + | < |
In file included from / | In file included from / | ||
from main.cpp:2: | from main.cpp:2: | ||
- | / | + | / |
- | main.cpp:18: | + | main.cpp:23: |
- | / | + | / |
/ | / | ||
/ | / | ||
Line 48: | Line 73: | ||
/ | / | ||
/ | / | ||
- | / | + | / |
- | / | + | / |
- | / | + | / |
- | / | + | / |
- | main.cpp:15: | + | main.cpp:20: |
- | / | + | / |
/ | / | ||
/ | / | ||
Line 71: | Line 96: | ||
из-за которой и происходит сбой компиляции. Вот так выглядит ее прототип в документации Qt [[http:// | из-за которой и происходит сбой компиляции. Вот так выглядит ее прототип в документации Qt [[http:// | ||
<code text> | <code text> | ||
- | Очевидно, | + | Очевидно, |
Обратимся к описанию данной функции. Исходя из документации она возвращает список всех ключей в QMultiMap в порядке возрастания. Логично предположить, | Обратимся к описанию данной функции. Исходя из документации она возвращает список всех ключей в QMultiMap в порядке возрастания. Логично предположить, | ||
Определим свой оператор сравнения следующим образом: | Определим свой оператор сравнения следующим образом: | ||
- | < | + | < |
template <class T> | template <class T> | ||
bool operator < | bool operator < | ||
Line 82: | Line 107: | ||
Если включить код данного оператора в код примера, | Если включить код данного оператора в код примера, | ||
- | Описанная выше | + | Проблема, |
- | QSharedPointer< | + | <code c++> |
+ | template <class T> | ||
+ | uint qHash(const | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Заключение ==== | ||
+ | Очевидно, | ||
+ | Описанная проблема устранена в новой версии Qt 4.7, которая входит в состав Qt SDK 1.1. Однако предложенное здесь решение остается актуальным, | ||
{{tag>}} | {{tag>}} |
etc/blog/q_multi_hash_map_qsharedpointer.txt · Last modified: 2011/01/27 21:30 by kkv