所以我有一个结构:
struct Alarm{
Alarm(QString operation, double comparison, QString text, quint8 color):
operation(operation), comparison(comparison), text(text), color(color){}
int element;
QString operation;
double comparison;
QString text;
quint8 color;
QDateTime riseTime;
};
请注意,它没有默认构造函数Alarm()
。我想有一个这种结构的对象的矢量容器。如果我尝试使用QVector
代码无法在我尝试使用此错误追加新对象的代码中编译:
/usr/include/x86_64-linux-gnu/qt5/QtCore/qvector.h: In instantiation of ‘void QVector<T>::defaultConstruct(T*, T*) [with T = Alarm]’:
/usr/include/x86_64-linux-gnu/qt5/QtCore/qvector.h:580:41: required from ‘void QVector<T>::reallocData(int, int, QArrayData::AllocationOptions) [with T = Alarm; QArrayData::AllocationOptions = QFlags<QArrayData::AllocationOption>]’
/usr/include/x86_64-linux-gnu/qt5/QtCore/qvector.h:654:20: required from ‘void QVector<T>::append(const T&) [with T = Alarm]’
/usr/include/x86_64-linux-gnu/qt5/QtCore/qvector.h:280:13: required from ‘QVector<T>& QVector<T>::operator<<(const T&) [with T = Alarm]’
/opt/buildagent/work/1a89dfc8903ef3d7/ground/gcs/src/plugins/qmlview/Alarms.cpp:56:243: required from here
/usr/include/x86_64-linux-gnu/qt5/QtCore/qvector.h:322:13: error: no matching function for call to ‘Alarm::Alarm()’
new (from++) T();
似乎QVector
要求它拥有的类具有默认构造函数。但是,使用std::vector<T>
编译就好了。
我的问题是为什么?这是否需要使用QVector来创建具有默认构造函数的类?或者我没有正确使用容器?
std :: vector工作原因不同的原因在于,在向量中,分配了原始未初始化的内存,然后在需要时调用复制构造函数来执行复制。此过程不需要调用resize()的默认构造函数。这就是默认构造函数没有依赖性的原因。
另一方面,QVector要求类型是默认可构造的,因为内部函数realloc()的实现方式。
根据QT文档:
存储在各种容器中的值可以是任何可分配的数据类型。要限定,类型必须提供默认构造函数,复制构造函数和赋值运算符。这涵盖了您可能希望存储在容器中的大多数数据类型,包括基本类型,如int和double,指针类型