我正在尝试将QScopedPointers存储在QList中。
我发现这个评论
也可以使用QList>。–Kuba Ober 2014年1月14日18:17
(对此答案的第一条评论:https://stackoverflow.com/a/21120575/3095014)
还有这个帖子https://forum.qt.io/topic/59338/solved-qlist-of-qscopedpointers这意味着这应该起作用。但如果我试图编译第二个链接的代码,我会得到以下错误:
E:QtQt5Enterprise5.5msvc2013includeQtCore/qlist.h(404) : error C2248: 'QScopedPointer<Label,QScopedPointerDeleter<T>>::QScopedPointer' : cannot access private member declared in class 'QScopedPointer<Label,QScopedPointerDeleter<T>>'
with
[
T=Label
]
E:QtQt5Enterprise5.5msvc2013includeQtCore/qscopedpointer.h(170) : see declaration of 'QScopedPointer<Label,QScopedPointerDeleter<T>>::QScopedPointer'
with
[
T=Label
]
E:QtQt5Enterprise5.5msvc2013includeQtCore/qlist.h(403) : while compiling class template member function 'void QList<QScopedPointer<Label,QScopedPointerDeleter<T>>>::node_construct(QList<QScopedPointer<T,QScopedPointerDeleter<T>>>::Node *,const QScopedPointer<T,QScopedPointerDeleter<T>> &)'
with
[
T=Label
]
E:QtQt5Enterprise5.5msvc2013includeQtCore/qlist.h(553) : see reference to function template instantiation 'void QList<QScopedPointer<Label,QScopedPointerDeleter<T>>>::node_construct(QList<QScopedPointer<T,QScopedPointerDeleter<T>>>::Node *,const QScopedPointer<T,QScopedPointerDeleter<T>> &)' being compiled
with
[
T=Label
]
E:QtQt5Enterprise5.5msvc2013includeQtCore/qlist.h(794) : while compiling class template member function 'QList<QScopedPointer<Label,QScopedPointerDeleter<T>>>::~QList(void)'
with
[
T=Label
]
..tableview_row_dndmain.cpp(13) : see reference to function template instantiation 'QList<QScopedPointer<Label,QScopedPointerDeleter<T>>>::~QList(void)' being compiled
with
[
T=Label
]
..tableview_row_dndmain.cpp(20) : see reference to class template instantiation 'QList<QScopedPointer<Label,QScopedPointerDeleter<T>>>' being compiled
with
[
T=Label
]
E:QtQt5Enterprise5.5msvc2013includeQtCore/qlist.h(405) : error C2248: 'QScopedPointer<Label,QScopedPointerDeleter<T>>::QScopedPointer' : cannot access private member declared in class 'QScopedPointer<Label,QScopedPointerDeleter<T>>'
with
[
T=Label
]
E:QtQt5Enterprise5.5msvc2013includeQtCore/qscopedpointer.h(170) : see declaration of 'QScopedPointer<Label,QScopedPointerDeleter<T>>::QScopedPointer'
with
[
T=Label
]
为什么这对我不起作用?
存储在Qt容器中的值应该是可分配的数据类型。这意味着它们应该有一个默认构造函数、一个复制构造函数和一个赋值运算符。
QScopedPointer
禁用了其复制构造函数和赋值运算符。不能将两个指针相互分配,但可以使用QScopedPointer::reset
、QScopedPointer::swap
或QScopedPointer::take
显式转移底层原始指针的所有权。
在某个时刻,移动构造函数和移动赋值运算符被添加到QScopedPointer
中。新的移动语义使这成为可能:
QList<QScopedPointer<Label>> mLabels;
mLabels.append(QScopedPointer<Label>(new Label));
在这里,一个临时值被添加到列表中,并且新的列表项是使用move构造函数创建的。
后来他们恢复了这种变化:
在QScopedPointer中添加移动构造函数毫无意义,因为移动意味着"逃离范围",这打破了根本点的QScopedPointer。
如果您真的想拥有一个智能指针列表,可以使用可赋值的QSharedPointer
或支持移动语义的std::unique_ptr
。
若你们讨论QObjects
子类,特别是小部件的寿命跟踪,我建议使用Qt子-父机制,而不是智能指针。