Я пытаюсь предотвратить голые указатели, чтобы предотвратить утечку памяти и т. Д. Я также хочу нанести int
на INuiSensor*. Поскольку я также использую Qt Я пытался использовать QMap<int, std::unique_ptr<INuiSensor>>
, чтобы сделать это, но исходный код QMap делает это невозможным:QMap и std :: unique_ptr
template <class Key, class T>
Q_INLINE_TEMPLATE typename QMap<Key, T>::iterator QMap<Key, T>::insert(const Key &akey, const T &avalue)
{
detach();
Node *n = d->root();
Node *y = d->end();
Node *last = 0;
bool left = true;
while (n) {
y = n;
if (!qMapLessThanKey(n->key, akey)) {
last = n;
left = true;
n = n->leftNode();
} else {
left = false;
n = n->rightNode();
}
}
if (last && !qMapLessThanKey(akey, last->key)) {
last->value = avalue;
return iterator(last);
}
Node *z = d->createNode(akey, avalue, y, left);
return iterator(z);
}
Линия:
last->value = avalue;
ли один, что создает проблему: вы не можете использовать оператор = непосредственно на unique_ptr. Итак, теперь я озадачен тем, что делать дальше. Можно ли использовать QMap и unique_ptr каким-то другим способом? По какой-то причине идея об использовании QMap и unique_ptr глупо? Что я могу сделать, чтобы предотвратить использование голых указателей при использовании QMap?
Это потому, что контейнеры Qt и указатели Qt - это дерьмо, откровенно говоря. Используйте std :: map, особенно если вы уже используете 'std :: unique_ptr'. Или _misuse_ 'QSharedPointer'. – Lol4t0
@ Lol4t0 Это сильное заявление, любые доказательства для его поддержки? – cmannett85
@ cmannett85, этот, 'QScopedPointer' не поддерживает семантику перемещения, контейнеры Qt рассматривают возможность использования итератора в качестве модификации (поэтому qvector.begin() не является потокобезопасным), только неупорядоченный набор, реализация хэш-функции сложна, и вы не можете указать один непосредственно и так далее. – Lol4t0