Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt QList of QScopedpointer_Qt_Containers_Qt5_Smart Pointers_Qscopedpointer - Fatal编程技术网

Qt QList of QScopedpointer

Qt QList of QScopedpointer,qt,containers,qt5,smart-pointers,qscopedpointer,Qt,Containers,Qt5,Smart Pointers,Qscopedpointer,我正在尝试将QScopedPointers存储在QList中 我发现了这个评论 也可以使用QList>–库巴奥伯2014年1月14日18:17 (对这个答案的第一个评论:) 这篇文章暗示这应该是有效的。但是如果我试图编译第二个链接的代码,我会得到以下错误: E:\Qt\Qt5Enterprise\5.5\msvc2013\include\QtCore/qlist.h(404) : error C2248: 'QScopedPointer<Label,QScopedPointerDelete

我正在尝试将QScopedPointers存储在QList中

我发现了这个评论

也可以使用QList>–库巴奥伯2014年1月14日18:17

(对这个答案的第一个评论:)

这篇文章暗示这应该是有效的。但是如果我试图编译第二个链接的代码,我会得到以下错误:

E:\Qt\Qt5Enterprise\5.5\msvc2013\include\QtCore/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:\Qt\Qt5Enterprise\5.5\msvc2013\include\QtCore/qscopedpointer.h(170) : see declaration of 'QScopedPointer<Label,QScopedPointerDeleter<T>>::QScopedPointer'
    with
    [
        T=Label
    ]
    E:\Qt\Qt5Enterprise\5.5\msvc2013\include\QtCore/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:\Qt\Qt5Enterprise\5.5\msvc2013\include\QtCore/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:\Qt\Qt5Enterprise\5.5\msvc2013\include\QtCore/qlist.h(794) : while compiling class template member function 'QList<QScopedPointer<Label,QScopedPointerDeleter<T>>>::~QList(void)'
    with
    [
        T=Label
    ]
    ..\tableview_row_dnd\main.cpp(13) : see reference to function template instantiation 'QList<QScopedPointer<Label,QScopedPointerDeleter<T>>>::~QList(void)' being compiled
    with
    [
        T=Label
    ]
    ..\tableview_row_dnd\main.cpp(20) : see reference to class template instantiation 'QList<QScopedPointer<Label,QScopedPointerDeleter<T>>>' being compiled
    with
    [
        T=Label
    ]
E:\Qt\Qt5Enterprise\5.5\msvc2013\include\QtCore/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:\Qt\Qt5Enterprise\5.5\msvc2013\include\QtCore/qscopedpointer.h(170) : see declaration of 'QScopedPointer<Label,QScopedPointerDeleter<T>>::QScopedPointer'
    with
    [
        T=Label
    ]
E:\Qt\Qt5Enterprise\5.5\msvc2013\include\QtCore/qlist.h(404):错误C2248:“QScopedPointer::QScopedPointer”:无法访问类“QScopedPointer”中声明的私有成员
具有
[
T=标签
]
E:\Qt\Qt5Enterprise\5.5\msvc2013\include\QtCore/qscopedpointer.h(170):参见“qscopedpointer::qscopedpointer”的声明
具有
[
T=标签
]
E:\Qt\Qt5Enterprise\5.5\msvc2013\include\QtCore/qlist.h(403):编译类模板成员函数“void qlist::node_construct(qlist::node*,const QScopedPointer&)”时
具有
[
T=标签
]
E:\Qt\Qt5Enterprise\5.5\msvc2013\include\QtCore/qlist.h(553):请参阅正在编译的函数模板实例化“void qlist::node_构造(qlist::node*,const QScopedPointer&)”的参考
具有
[
T=标签
]
E:\Qt\Qt5Enterprise\5.5\msvc2013\include\QtCore/qlist.h(794):编译类模板成员函数“qlist::~qlist(void)”时
具有
[
T=标签
]
..\tableview\u row\u dnd\main.cpp(13):请参阅正在编译的函数模板实例化“QList::~QList(void)”的参考
具有
[
T=标签
]
..\tableview\u row\u dnd\main.cpp(20):请参阅对正在编译的类模板实例化“QList”的引用
具有
[
T=标签
]
E:\Qt\Qt5Enterprise\5.5\msvc2013\include\QtCore/qlist.h(405):错误C2248:“QScopedPointer::QScopedPointer”:无法访问类“QScopedPointer”中声明的私有成员
具有
[
T=标签
]
E:\Qt\Qt5Enterprise\5.5\msvc2013\include\QtCore/qscopedpointer.h(170):参见“qscopedpointer::qscopedpointer”的声明
具有
[
T=标签
]

为什么这对我不起作用?

存储在Qt容器中的值应该是可分配的数据类型。这意味着它们应该有一个默认构造函数、一个复制构造函数和一个赋值运算符

QScopedPointer
已禁用其复制构造函数和赋值运算符。您不能将两个指针相互分配,但可以使用
QScopedPointer::reset
QScopedPointer::swap
QScopedPointer::take
显式转移基础原始指针的所有权

将移动构造函数和移动分配运算符添加到
QScopedPointer
。新的移动语义使这成为可能:

QList<QScopedPointer<Label>> mLabels;
mLabels.append(QScopedPointer<Label>(new Label));
QList-mLabels;
附加(QScopedPointer(新标签));
在这里,一个临时值被添加到一个列表中,新的列表项是使用move构造函数创建的

他们恢复了这一变化:

向QScopedPointer添加移动构造函数没有意义,因为 移动意味着“逃离范围”,这打破了基本点 QScopedPointer的

如果您确实想拥有智能指针列表,可以使用可分配的
QSharedPointer
,或者支持移动语义的
std::unique\u ptr


如果你谈到跟踪
QObjects
子类,特别是小部件的生命周期,我建议使用Qt子-父机制而不是智能指针。

展示你代码的相关部分。正如我所写的:这正是本文中问题的代码(没有foo函数)请注意,与STL容器相比,对可分配数据类型的要求极不理想。在一些情况下(例如:默认可构造性),需求是由较差的实现引起的。解决方法:如果确实需要
unique\u ptr
的向量,请使用STL容器而不是Qt容器。