I am trying to prevent naked pointers, to prevent memory leaking etc. I also want to map int
to INuiSensor*. Since I am also using Qt I tried to use QMap<int, std::unique_ptr<INuiSensor>>
to do this, but the source code of QMap makes this impossible:
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);
}
The line:
last->value = avalue;
Is the one that creates the problem: you cannot use the =operator directly on a unique_ptr. So now I am puzzeled on what to do next. Is it possible to use QMap and unique_ptr in some other way? Is the whole idea of using QMap and unique_ptr stupid for some reason? What can I do to prevent using naked pointers while still using a QMap?
std::unique_ptr
. Or misuseQSharedPointer
. – PetrographyQScopedPointer
does not support move semantics, Qt containers consider taking an iterator as modification (that's why qvector.begin() is not thread safe), only unordered set, hash function implementation is tricky and you cannot specify one directly and so on. – Petrography