Qt 如何创建QSharedPointer<;QMap<;a、 b>&燃气轮机;用初始化列表? 什么有效

Qt 如何创建QSharedPointer<;QMap<;a、 b>&燃气轮机;用初始化列表? 什么有效,qt,c++11,qmap,qsharedpointer,Qt,C++11,Qmap,Qsharedpointer,在Qt5.12.4中,我尝试动态创建QSharedPointer。我知道我能做到 QMap<int, bool> mp = { { 1, true } }; 什么没有 我想在一个单一的镜头,这是我无法做到的。我试过最明显的 QSharedPointer<QMap<int, bool>> mpsptr = QSharedPointer<QMap<int, bool>>::create(new QMap<in

在Qt5.12.4中,我尝试动态创建
QSharedPointer
。我知道我能做到

QMap<int, bool> mp = { { 1, true } };
什么没有 我想在一个单一的镜头,这是我无法做到的。我试过最明显的

QSharedPointer<QMap<int, bool>> mpsptr =
            QSharedPointer<QMap<int, bool>>::create(new QMap<int, bool> { { 1, false } });
QSharedPointer mpsptr=
QSharedPointer::create(新QMap{{1,false});
但是没有用。编译器警告我类型不匹配,但我看不到必须更改代码以使其编译的点。有什么想法吗?提前谢谢

编译器错误
在D:\Qt\5.12.4\mingw73\u 64\include/QtCore/qsharedpointer.h:48:0中包含的文件中,
来自D:\Qt\5.12.4\mingw73\u 64\include/QtCore/qdebug.h:54,
来自D:\Qt\5.12.4\mingw73\u 64\include\QtCore/qloggingcontegory.h:44,
来自D:\Qt\5.12.4\mingw73\u 64\include\QtCore/qloggingcontegory:1,
从..\\..\myLibsQt\src\libs/a/foo.h:4,
从..\..\..\myLibsQt\src\libs/a/bar.h:8,
从..\..\..\myLibsQt\src\libs/b/baz.h:8,
从..\..\..\myLibsQt\src\libs/c/bla.h:8,
来自..\..\..\myLibsQt\src\libs\c\blubb.cpp:1:
D:\Qt\5.12.4\mingw73_64\include/QtCore/qsharedpointer_impl.h:在“静态qsharedpointer qsharedpointer::create(Args&&…[带Args={QMap*};T=QMap]”的实例化中:
..\..\..\..\..\myLibsQt\src\libs\c\blubb.cpp:27:80:此处为必填项
D:\Qt\5.12.4\mingw73\u 64\include/QtCore/qsharedpointer\u impl.h:445:9:错误:调用“QMap::QMap(QMap*)”没有匹配的函数
新(ptr)T(std::forward(arguments)…);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
在D:\Qt\5.12.4\mingw73\u 64\include/QtCore/qdebug.h:47:0中包含的文件中,
来自D:\Qt\5.12.4\mingw73\u 64\include\QtCore/qloggingcontegory.h:44,
来自D:\Qt\5.12.4\mingw73\u 64\include\QtCore/qloggingcontegory:1,
从..\\..\myLibsQt\src\libs/a/foo.h:4,
从..\..\..\myLibsQt\src\libs/a/bar.h:8,
从..\..\..\myLibsQt\src\libs/b/baz.h:8,
从..\..\..\myLibsQt\src\libs/c/bla.h:8,
来自..\..\..\myLibsQt\src\libs\c\blubb.cpp:1:
D:\Qt\5.12.4\mingw73\u 64\include/QtCore/qmap.h:1164:22:注:候选:qmap::qmap(const std::map&)[带Key=int;T=bool]
Q_线外模板QMap::QMap(const std::map&other)
^~~~~~~~~~~~
D:\Qt\5.12.4\mingw73\u 64\include/QtCore/qmap.h:1164:22:注意:参数1从'qmap*'到'const std::map&'的转换未知
D:\Qt\5.12.4\mingw73\u 64\include/QtCore/qmap.h:343:12:注:候选:qmap::qmap(qmap&)[带Key=int;T=bool]
内联QMap(QMap和其他)Q_DECL_NOTHROW
^~~~
D:\Qt\5.12.4\mingw73\u 64\include/QtCore/qmap.h:343:12:注意:参数1从'qmap*'到'qmap&'没有已知的转换
D:\Qt\5.12.4\mingw73\u 64\include/QtCore/qmap.h:622:8:注:候选:qmap::qmap(const qmap&)[带Key=int;T=bool]
内联QMap::QMap(常量QMap和其他)
^~~~~~~~~~~~
D:\Qt\5.12.4\mingw73\u 64\include/QtCore/qmap.h:622:8:注意:参数1从'qmap*'到'const qmap&'没有已知的转换
D:\Qt\5.12.4\mingw73\u 64\include/QtCore/qmap.h:330:12:注:候选:qmap::qmap(std::initializer\u list)[带Key=int;T=bool]
内联QMap(标准::初始值设定项\u列表)
^~~~
D:\Qt\5.12.4\mingw73\u 64\include/QtCore/qmap.h:330:12:注意:参数1从'qmap*'到'std::initializer\u list'没有已知的转换
D:\Qt\5.12.4\mingw73\u 64\include/QtCore/qmap.h:328:12:注意:候选:qmap::qmap()[带Key=int;T=bool]
内联QMap()Q_DECL_NOTHROW:d(静态_cast(const_cast(&QMapDataBase::shared_null)){}
^~~~
D:\Qt\5.12.4\mingw73\u 64\include/QtCore/qmap.h:328:12:注意:候选者需要0个参数,提供1个
mingw32 make[1]:***[Makefile.Debug:1488:Debug/blubb.o]错误1

好的,我找到了一个适合我的答案。上面的一个不是用msvc17和我的arm工具链编译的。我的第一种方法也会产生内存泄漏

正确的方法是

QSharedPointer<QMap<int, bool>> mpsptr(new QMap<int, bool> { { 1, false } });
QSharedPointer-mpsptr(新QMap{{1,false});

传递给create的参数被直接传递给构造函数。因此,您只需执行以下操作:

QSharedPointer<QMap<int, bool>> mpsptr =  QSharedPointer<QMap<int, bool>>::create({
  { 1, false }
});
QSharedPointer mpsptr=QSharedPointer::create({
{1,false}
});
如果您使用C++11或更高版本,为什么不使用auto

auto mpsptr =  QSharedPointer<QMap<int, bool>>::create({
  { 1, false }
});
auto-mpsptr=QSharedPointer::create({
{1,false}
});

来自编译器错误:
QSharedPointer::create(Args&&…
您可以从中读取,您应该传递多个参数,而不仅仅是一个指针。这是第一个提示。同样来自此:
no mying函数用于调用“QMap::QMap(QMap*)”
(原文-mying是怎么回事?)。从中可以看出,Qt试图将指针传递给
QMap
的构造函数。这些提示应该是向前迈出的一大步。读取
不匹配的内容
。复制粘贴错误。我找到了解决办法。那个地方的创造是错误的。它从引用中创建一个新的引用。它通过常规构造函数工作。这绝对不是您应该如何使用
QSharedPointer::create()
,因为即使修改也不准确:正如您所说,它会造成内存泄漏,而共享指针应该有助于自动内存管理。我修改了我的答案,因此,你的评论对其他人来说不再有用了,可能你考虑删除它。它似乎没有用MSVC 15X编译,你的两个结构都没有用MSVC17和我使用的ARM工具链编译。我在自己的回答中使用的答案是正确的。
QSharedPointer<QMap<int, bool>> mpsptr(new QMap<int, bool> { { 1, false } });
QSharedPointer<QMap<int, bool>> mpsptr =  QSharedPointer<QMap<int, bool>>::create({
  { 1, false }
});
auto mpsptr =  QSharedPointer<QMap<int, bool>>::create({
  { 1, false }
});