LINUX.ORG.RU

Компиляция Qt-проекта. Кто-то хочет конструктор без аргументов.

 


0

1

У меня есть класс AttachTableData, он имеет конструктор с аргументом:

AttachTableData::AttachTableData(Record *iRecord)

Но при компиляции в дебрях Qt почему-то требуется конструктор без аргументов. Я проверил места создания этого объекта. В коде нет места, в котором бы создавался объект без аргументов. Но компилятор всеравно хочет без аргумента.

И проблема в том, что в тексте ошибки не показывается, в каком месте вдруг потребовался конструктор без аргумента.

Текст ошибки (компиляю на вендоноутбуке, до линуксовой машины доберусь в конце недели):

In file included from C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qobject.h:48:0,
                 from C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qtranslator.h:37,
                 from C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/QTranslator:1,
                 from ../mytetra_develop/src/main.cpp:3:
C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qmetatype.h: In instantiation of 'static void* QtMetaTypePrivate::QMetaTypeFunctionHelper<T, Accepted>::Create(const void*) [with T = AttachTableData; bool Accepted = true]':
C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qmetatype.h:1603:76:   required from 'int qRegisterNormalizedMetaType(const QByteArray&, T*, typename QtPrivate::MetaTypeDefinedHelper<T, (QMetaTypeId2<T>::Defined && (! QMetaTypeId2<T>::IsBuiltIn))>::DefinedType) [with T = AttachTableData; typename QtPrivate::MetaTypeDefinedHelper<T, (QMetaTypeId2<T>::Defined && (! QMetaTypeId2<T>::IsBuiltIn))>::DefinedType = QtPrivate::MetaTypeDefinedHelper<AttachTableData, true>::DefinedType]'
C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qmetatype.h:1628:77:   required from 'int qRegisterMetaType(const char*, T*, typename QtPrivate::MetaTypeDefinedHelper<T, (QMetaTypeId2<T>::Defined && (! QMetaTypeId2<T>::IsBuiltIn))>::DefinedType) [with T = AttachTableData; typename QtPrivate::MetaTypeDefinedHelper<T, (QMetaTypeId2<T>::Defined && (! QMetaTypeId2<T>::IsBuiltIn))>::DefinedType = QtPrivate::MetaTypeDefinedHelper<AttachTableData, true>::DefinedType]'
../mytetra_develop/src/models/attachTable/AttachTableData.h:44:1:   required from here
C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qmetatype.h:714:22: error: no matching function for call to 'AttachTableData::AttachTableData()'
         return new T();
                      ^
C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qmetatype.h:714:22: note: candidates are:
In file included from ../mytetra_develop/src/libraries/ClipboardRecords.h:11:0,
                 from ../mytetra_develop/src/main.cpp:16:
../mytetra_develop/src/models/attachTable/AttachTableData.h:16:3: note: AttachTableData::AttachTableData(const AttachTableData&)
   AttachTableData(const AttachTableData &obj);
   ^
../mytetra_develop/src/models/attachTable/AttachTableData.h:16:3: note:   candidate expects 1 argument, 0 provided
../mytetra_develop/src/models/attachTable/AttachTableData.h:15:3: note: AttachTableData::AttachTableData(Record*)
   AttachTableData(Record *iRecord);
   ^
../mytetra_develop/src/models/attachTable/AttachTableData.h:15:3: note:   candidate expects 1 argument, 0 provided
In file included from C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qobject.h:48:0,
                 from C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qtranslator.h:37,
                 from C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/QTranslator:1,
                 from ../mytetra_develop/src/main.cpp:3:
C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qmetatype.h: In instantiation of 'static void* QtMetaTypePrivate::QMetaTypeFunctionHelper<T, Accepted>::Construct(void*, const void*) [with T = AttachTableData; bool Accepted = true]':
C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qmetatype.h:1603:76:   required from 'int qRegisterNormalizedMetaType(const QByteArray&, T*, typename QtPrivate::MetaTypeDefinedHelper<T, (QMetaTypeId2<T>::Defined && (! QMetaTypeId2<T>::IsBuiltIn))>::DefinedType) [with T = AttachTableData; typename QtPrivate::MetaTypeDefinedHelper<T, (QMetaTypeId2<T>::Defined && (! QMetaTypeId2<T>::IsBuiltIn))>::DefinedType = QtPrivate::MetaTypeDefinedHelper<AttachTableData, true>::DefinedType]'
C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qmetatype.h:1628:77:   required from 'int qRegisterMetaType(const char*, T*, typename QtPrivate::MetaTypeDefinedHelper<T, (QMetaTypeId2<T>::Defined && (! QMetaTypeId2<T>::IsBuiltIn))>::DefinedType) [with T = AttachTableData; typename QtPrivate::MetaTypeDefinedHelper<T, (QMetaTypeId2<T>::Defined && (! QMetaTypeId2<T>::IsBuiltIn))>::DefinedType = QtPrivate::MetaTypeDefinedHelper<AttachTableData, true>::DefinedType]'
../mytetra_develop/src/models/attachTable/AttachTableData.h:44:1:   required from here
C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qmetatype.h:727:28: error: no matching function for call to 'AttachTableData::AttachTableData()'
         return new (where) T;
                            ^
C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qmetatype.h:727:28: note: candidates are:
In file included from ../mytetra_develop/src/libraries/ClipboardRecords.h:11:0,
                 from ../mytetra_develop/src/main.cpp:16:
../mytetra_develop/src/models/attachTable/AttachTableData.h:16:3: note: AttachTableData::AttachTableData(const AttachTableData&)
   AttachTableData(const AttachTableData &obj);
   ^
../mytetra_develop/src/models/attachTable/AttachTableData.h:16:3: note:   candidate expects 1 argument, 0 provided
../mytetra_develop/src/models/attachTable/AttachTableData.h:15:3: note: AttachTableData::AttachTableData(Record*)
   AttachTableData(Record *iRecord);
   ^
../mytetra_develop/src/models/attachTable/AttachTableData.h:15:3: note:   candidate expects 1 argument, 0 provided
In file included from C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qobject.h:48:0,
                 from C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/QObject:1,
                 from ../mytetra_develop/src/views/recordTable/RecordTableView.cpp:1:
C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qmetatype.h: In instantiation of 'static void* QtMetaTypePrivate::QMetaTypeFunctionHelper<T, Accepted>::Create(const void*) [with T = AttachTableData; bool Accepted = true]':
C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qmetatype.h:1603:76:   required from 'int qRegisterNormalizedMetaType(const QByteArray&, T*, typename QtPrivate::MetaTypeDefinedHelper<T, (QMetaTypeId2<T>::Defined && (! QMetaTypeId2<T>::IsBuiltIn))>::DefinedType) [with T = AttachTableData; typename QtPrivate::MetaTypeDefinedHelper<T, (QMetaTypeId2<T>::Defined && (! QMetaTypeId2<T>::IsBuiltIn))>::DefinedType = QtPrivate::MetaTypeDefinedHelper<AttachTableData, true>::DefinedType]'
C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qmetatype.h:1628:77:   required from 'int qRegisterMetaType(const char*, T*, typename QtPrivate::MetaTypeDefinedHelper<T, (QMetaTypeId2<T>::Defined && (! QMetaTypeId2<T>::IsBuiltIn))>::DefinedType) [with T = AttachTableData; typename QtPrivate::MetaTypeDefinedHelper<T, (QMetaTypeId2<T>::Defined && (! QMetaTypeId2<T>::IsBuiltIn))>::DefinedType = QtPrivate::MetaTypeDefinedHelper<AttachTableData, true>::DefinedType]'
../mytetra_develop/src/models/attachTable/AttachTableData.h:44:1:   required from here
C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qmetatype.h:714:22: error: no matching function for call to 'AttachTableData::AttachTableData()'
         return new T();
                      ^
C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qmetatype.h:714:22: note: candidates are:
In file included from ../mytetra_develop/src/libraries/ClipboardRecords.h:11:0,
                 from ../mytetra_develop/src/views/recordTable/RecordTableView.cpp:10:
../mytetra_develop/src/models/attachTable/AttachTableData.h:16:3: note: AttachTableData::AttachTableData(const AttachTableData&)
   AttachTableData(const AttachTableData &obj);
   ^
../mytetra_develop/src/models/attachTable/AttachTableData.h:16:3: note:   candidate expects 1 argument, 0 provided
../mytetra_develop/src/models/attachTable/AttachTableData.h:15:3: note: AttachTableData::AttachTableData(Record*)
   AttachTableData(Record *iRecord);
   ^
../mytetra_develop/src/models/attachTable/AttachTableData.h:15:3: note:   candidate expects 1 argument, 0 provided
In file included from C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qobject.h:48:0,
                 from C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/QObject:1,
                 from ../mytetra_develop/src/views/recordTable/RecordTableView.cpp:1:
C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qmetatype.h: In instantiation of 'static void* QtMetaTypePrivate::QMetaTypeFunctionHelper<T, Accepted>::Construct(void*, const void*) [with T = AttachTableData; bool Accepted = true]':
C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qmetatype.h:1603:76:   required from 'int qRegisterNormalizedMetaType(const QByteArray&, T*, typename QtPrivate::MetaTypeDefinedHelper<T, (QMetaTypeId2<T>::Defined && (! QMetaTypeId2<T>::IsBuiltIn))>::DefinedType) [with T = AttachTableData; typename QtPrivate::MetaTypeDefinedHelper<T, (QMetaTypeId2<T>::Defined && (! QMetaTypeId2<T>::IsBuiltIn))>::DefinedType = QtPrivate::MetaTypeDefinedHelper<AttachTableData, true>::DefinedType]'
C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qmetatype.h:1628:77:   required from 'int qRegisterMetaType(const char*, T*, typename QtPrivate::MetaTypeDefinedHelper<T, (QMetaTypeId2<T>::Defined && (! QMetaTypeId2<T>::IsBuiltIn))>::DefinedType) [with T = AttachTableData; typename QtPrivate::MetaTypeDefinedHelper<T, (QMetaTypeId2<T>::Defined && (! QMetaTypeId2<T>::IsBuiltIn))>::DefinedType = QtPrivate::MetaTypeDefinedHelper<AttachTableData, true>::DefinedType]'
../mytetra_develop/src/models/attachTable/AttachTableData.h:44:1:   required from here
C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qmetatype.h:727:28: error: no matching function for call to 'AttachTableData::AttachTableData()'
         return new (where) T;
                            ^
C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qmetatype.h:727:28: note: candidates are:
In file included from ../mytetra_develop/src/libraries/ClipboardRecords.h:11:0,
                 from ../mytetra_develop/src/views/recordTable/RecordTableView.cpp:10:
../mytetra_develop/src/models/attachTable/AttachTableData.h:16:3: note: AttachTableData::AttachTableData(const AttachTableData&)
   AttachTableData(const AttachTableData &obj);
   ^
../mytetra_develop/src/models/attachTable/AttachTableData.h:16:3: note:   candidate expects 1 argument, 0 provided
../mytetra_develop/src/models/attachTable/AttachTableData.h:15:3: note: AttachTableData::AttachTableData(Record*)
   AttachTableData(Record *iRecord);
   ^
../mytetra_develop/src/models/attachTable/AttachTableData.h:15:3: note:   candidate expects 1 argument, 0 provided
Makefile.Debug:9137: recipe for target 'build/main.o' failed
mingw32-make[1]: *** [build/main.o] Error 1

Ссылка на исходники проекта:

https://github.com/xintrea/mytetra_dev/commit/9b93eec7bcff6addc71f82e452a0ff7...

★★★★★

C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qmetatype.h:714:22: error: no matching function for call to 'AttachTableData::AttachTableData()'
         return new T();
                      ^
C:/tools/qt/qt5.4.2/5.4/mingw491_32/include/QtCore/qmetatype.h:714:22: note: candidates are:
In file included from ../mytetra_develop/src/libraries/ClipboardRecords.h:11:0,
                 from ../mytetra_develop/src/main.cpp:16:
../mytetra_develop/src/models/attachTable/AttachTableData.h:16:3: note: AttachTableData::AttachTableData(const AttachTableData&)
   AttachTableData(const AttachTableData &obj);
   ^
../mytetra_develop/src/models/attachTable/AttachTableData.h:16:3: note:   candidate expects 1 argument, 0 provided
../mytetra_develop/src/models/attachTable/AttachTableData.h:15:3: note: AttachTableData::AttachTableData(Record*)
   AttachTableData(Record *iRecord);
   ^
annulen ★★★★★ ()

Вот же

../mytetra_develop/src/models/attachTable/AttachTableData.h:44:1: required from here

Q_DECLARE_METATYPE(AttachTableData);

http://doc.qt.io/qt-5/qmetatype.html#Q_DECLARE_METATYPE

This macro makes the type Type known to QMetaType as long as it provides a public default constructor, a public copy constructor and a public destructor. It is needed to use the type Type as a custom type in QVariant.

fluorite ★★★★★ ()
Последнее исправление: fluorite (всего исправлений: 1)
Ответ на: комментарий от fluorite

This macro makes the type Type known to QMetaType as long as it provides a public default constructor, a public copy constructor and a public destructor. It is needed to use the type Type as a custom type in QVariant.

1. И где здесь требование, что конструктор не должен иметь аргументов?

2. Допустим, что я делаю такой конструктор. Значит ли это, что программа будет пытаться создавать объекты с конструктором без аргументов, а значит и не инициализировать ссылку на данные. Когда это будет происходить (ведь не просто так компилятор хочет без аргументов)? Как от этого уберечься?

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

1. И где здесь требование, что конструктор не должен иметь аргументов?

default constructor и означает конструктор без аргументов.

fluorite ★★★★★ ()
Последнее исправление: fluorite (всего исправлений: 2)
Ответ на: комментарий от Xintrea

2

Чёт запутался во всей той шаблонной магии, которая внутри QMetaType и QVariant, ну да неважно. Важно то, что для её работы нужен конструктор без аргументов.

 // A.h
class A { public: int _a; A() : _a(-1) {} A(int a) : _a(a) {} };
Q_DECLARE_METATYPE(A) 

// main.cpp
A a1(1);
QVariant v1;
v1.setValue(a1);
qDebug() << v1.value<A>()._a; // 1

A a2;
QVariant v2;
v2.setValue(a2);
qDebug() << v2.value<A>()._a; // -1
Уберечься можно используя внимательность и тесты, либо не используя QVariant.

fluorite ★★★★★ ()
Ответ на: комментарий от Xintrea

Когда это будет происходить (ведь не просто так компилятор хочет без аргументов)?

К примеру так: AttachTableData data = myVariant.value<AttachTableData>(); Подозреваю, что вместо самих данных стоит запихивать в QVariant указатель на них, если следовать RAII и запрещать создавать объект без валидных агрументов.

Dendy ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.