Qt编译错误:C2280:尝试引用已删除的函数

时间:2016-05-23 17:20:36

标签: c++ qt

我有一个相对简单的类,其中包含一些显示为卡片的小部件(label,lineEdits,pushButtons)的布局。一切正常,直到我尝试添加信号和插槽。下面的头文件可以很好地编译,如图所示。

#include <QString>
#include <QObject>
#include <QWidget>

class KMLFile //: public QObject
{
    //Q_OBJECT
public:
    KMLFile();
    ~KMLFile();

    QString m_originalFilename;
    QString m_originalPath;
    QString m_proposedFilename;
    QString m_propsoedPath;
    QString m_coords;
    QWidget* trackWidget;

    void populate(QString originalFilename, QString originalPath, QString proposedFilename, QString coords);
    QString getCoords();
    int getLength();

//public slots:
    //void changeFilename();

};

当保留这些代码时,我收到以下错误:

  

“C:... \ qlist.h:425:错误:C2280:'KMLFile :: KMLFile(const KMLFile&amp;)':   试图引用已删除的功能

我正在使用Qt5.3和Qt Creator。我尝试过清理,运行qmake并删除build文件夹无济于事。我很难过!

感谢任何有关如何解决这个问题的见解,以便我能够进步。

2 个答案:

答案 0 :(得分:2)

QObject的复制构造函数是私有的 - 或已删除。

代码中的其他地方使用KMLFile的复制构造函数,然后调用QObject的复制构造函数。

您可以重新实现KMLFile的复制构造函数,但最好的解决方案是根本不使用它。

QList中,您应该存储指向KMLFile对象的指针而不是对象本身,前提是它们的存活时间比列表本身长。或者您可以开始使用QSharedPointer

答案 1 :(得分:1)

QObject有一个已删除的复制构造函数。您的类正在创建编译器生成的复制构造函数。当您使QObject成为类的基础时,编译器为KLMFile生成的复制构造函数会尝试调用基类的已删除复制构造函数,即出现错误时。

如果需要,将自动生成KLMFile的复制构造函数(即,如果您尝试复制该类的实例),除非您明确指定了自己的复制构造函数。

如果错误中引用的行靠近KLMFile类的副本,那么这将是一个强烈的指示。