Как создать QSharedPointer> со списком инициализаторов? - PullRequest
0 голосов
/ 25 октября 2019

Что работает

В Qt 5.12.4 я пытаюсь динамически создать QSharedPointer<QMap<int,bool>>. Я знаю, что могу сделать

QMap<int, bool> mp = { { 1, true } };

, а также динамически с

QMap<int, bool>* mpptr = new QMap<int, bool> { { 1, false } };

Я знаю, что я могу создать свой QSharedPointer следующим образом:

QMap<int, bool>* mpptr = new QMap<int, bool> { { 1, false } };
        QSharedPointer<QMap<int, bool>> shraredmpptr(mpptr);

Что не

Я хочу сделать это одним выстрелом, чего я не могу достичь. Я попробовал самое очевидное

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

, но безрезультатно. Компилятор предупреждает меня, что мои типы не совпадают, но я не вижу точки, в которой мне нужно изменить код, чтобы он компилировался. Есть идеи? Заранее спасибо.

Ошибки компиляции

In file included from D:\Qt\5.12.4\mingw73_64\include/QtCore/qsharedpointer.h:48:0,
                 from D:\Qt\5.12.4\mingw73_64\include/QtCore/qdebug.h:54,
                 from D:\Qt\5.12.4\mingw73_64\include\QtCore/qloggingcategory.h:44,
                 from D:\Qt\5.12.4\mingw73_64\include\QtCore/QLoggingCategory:1,
                 from ..\..\..\..\myLibsQt\src\libs/a/foo.h:4,
                 from ..\..\..\..\myLibsQt\src\libs/a/bar.h:8,
                 from ..\..\..\..\myLibsQt\src\libs/b/baz.h:8,
                 from ..\..\..\..\myLibsQt\src\libs/c/bla.h:8,
                 from ..\..\..\..\myLibsQt\src\libs\c\blubb.cpp:1:
D:\Qt\5.12.4\mingw73_64\include/QtCore/qsharedpointer_impl.h: In instantiation of 'static QSharedPointer<T> QSharedPointer<T>::create(Args&& ...) [with Args = {QMap<int, bool>*}; T = QMap<int, bool>]':
..\..\..\..\myLibsQt\src\libs\c\blubb.cpp:27:80:   required from here
D:\Qt\5.12.4\mingw73_64\include/QtCore/qsharedpointer_impl.h:445:9: error: no matching function for call to 'QMap<int, bool>::QMap(QMap<int, bool>*)'
         new (ptr) T(std::forward<Args>(arguments)...);
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from D:\Qt\5.12.4\mingw73_64\include/QtCore/qdebug.h:47:0,
                 from D:\Qt\5.12.4\mingw73_64\include\QtCore/qloggingcategory.h:44,
                 from D:\Qt\5.12.4\mingw73_64\include\QtCore/QLoggingCategory:1,
                 from ..\..\..\..\myLibsQt\src\libs/a/foo.h:4,
                 from ..\..\..\..\myLibsQt\src\libs/a/bar.h:8,
                 from ..\..\..\..\myLibsQt\src\libs/b/baz.h:8,
                 from ..\..\..\..\myLibsQt\src\libs/c/bla.h:8,
                 from ..\..\..\..\myLibsQt\src\libs\c\blubb.cpp:1:
D:\Qt\5.12.4\mingw73_64\include/QtCore/qmap.h:1164:22: note: candidate: QMap<K, V>::QMap(const std::map<Key, T>&) [with Key = int; T = bool]
 Q_OUTOFLINE_TEMPLATE QMap<Key, T>::QMap(const std::map<Key, T> &other)
                      ^~~~~~~~~~~~
D:\Qt\5.12.4\mingw73_64\include/QtCore/qmap.h:1164:22: note:   no known conversion for argument 1 from 'QMap<int, bool>*' to 'const std::map<int, bool, std::less<int>, std::allocator<std::pair<const int, bool> > >&'
D:\Qt\5.12.4\mingw73_64\include/QtCore/qmap.h:343:12: note: candidate: QMap<K, V>::QMap(QMap<K, V>&&) [with Key = int; T = bool]
     inline QMap(QMap<Key, T> &&other) Q_DECL_NOTHROW
            ^~~~
D:\Qt\5.12.4\mingw73_64\include/QtCore/qmap.h:343:12: note:   no known conversion for argument 1 from 'QMap<int, bool>*' to 'QMap<int, bool>&&'
D:\Qt\5.12.4\mingw73_64\include/QtCore/qmap.h:622:8: note: candidate: QMap<K, V>::QMap(const QMap<K, V>&) [with Key = int; T = bool]
 inline QMap<Key, T>::QMap(const QMap<Key, T> &other)
        ^~~~~~~~~~~~
D:\Qt\5.12.4\mingw73_64\include/QtCore/qmap.h:622:8: note:   no known conversion for argument 1 from 'QMap<int, bool>*' to 'const QMap<int, bool>&'
D:\Qt\5.12.4\mingw73_64\include/QtCore/qmap.h:330:12: note: candidate: QMap<K, V>::QMap(std::initializer_list<std::pair<_T1, _T2> >) [with Key = int; T = bool]
     inline QMap(std::initializer_list<std::pair<Key,T> > list)
            ^~~~
D:\Qt\5.12.4\mingw73_64\include/QtCore/qmap.h:330:12: note:   no known conversion for argument 1 from 'QMap<int, bool>*' to 'std::initializer_list<std::pair<int, bool> >'
D:\Qt\5.12.4\mingw73_64\include/QtCore/qmap.h:328:12: note: candidate: QMap<K, V>::QMap() [with Key = int; T = bool]
     inline QMap() Q_DECL_NOTHROW : d(static_cast<QMapData<Key, T> *>(const_cast<QMapDataBase *>(&QMapDataBase::shared_null))) { }
            ^~~~
D:\Qt\5.12.4\mingw73_64\include/QtCore/qmap.h:328:12: note:   candidate expects 0 arguments, 1 provided
mingw32-make[1]: *** [Makefile.Debug:1488: debug/blubb.o] Error 1

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Аргументы, переданные для создания, точно передаются конструктору. Поэтому вы можете просто сделать:

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

А если вы используете C ++ 11 или выше, почему бы не использовать auto?

auto mpsptr =  QSharedPointer<QMap<int, bool>>::create({
  { 1, false }
});
0 голосов
/ 25 октября 2019

Хорошо, я нашел ответ, который работает для меня. вышеупомянутый не компилировался с msvc17 и с моей связкой инструментов руки. Также мой первый подход приводит к утечке памяти.

Правильный способ сделать это -

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