使用带有Q_DECLARE_METATYPE的默认生成的复制构造函数

时间:2016-03-16 21:55:43

标签: c++ qt

假设我有这个自定义类

struct Analytics : public QObject
{
  Q_OBJECT

  public:
  int a  = 12;

  Analytics(const Analytics& a) {
  }

  Analytics(){
  }

};

Q_DECLARE_METATYPE(Analytics)

以上工作正常。但是我必须提供自己的复制构造函数。 我使用默认生成的复制构造函数尝试了这个,但是我得到了错误

struct Analytics:public QObject     {       Q_OBJECT

  public:
  int a  = 12;

  Analytics(const Analytics& a) = default;

  Analytics(){
  }

};

Q_DECLARE_METATYPE(Analytics)

这是我得到的错误

  5: error: call to implicitly-deleted copy constructor of 'Analytics'
                return new (where) T(*static_cast<const T*>(t));

是否可以将Q_DECLARE_METATYPE与默认生成的复制构造函数一起使用。

1 个答案:

答案 0 :(得分:0)

来自文档:

  

QObject既没有复制构造函数也没有赋值运算符。   这是设计的。实际上,他们被宣布,但在私人   带有宏Q_DISABLE_COPY()的部分。实际上,所有的Qt类   派生自QObject(直接或间接)使用此宏来声明   他们的复制构造函数和赋值运算符是私有的。该   关于Qt上的身份与价值的讨论中可以找到推理   对象模型页面。

因此,您无法复制从QObject派生的QObject和类。如果要使用QObjects的信号和插槽机制,请改用指针。