QVECTOR与STD :: VECTER的复杂类型



所以我有一个结构:

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的类型,指针类型

相关内容

  • 没有找到相关文章

最新更新