【问题标题】:Qt compile error: C2280: attempting to reference a deleted functionQt 编译错误:C2280:试图引用已删除的函数
【发布时间】:2016-05-23 17:20:36
【问题描述】:

我有一个相对简单的类,其中包含一个布局,其中包含一些显示为卡片的小部件(标签、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 &)': 试图引用已删除的函数

我正在使用 Qt5.3 和 Qt Creator。我试过清理、运行 qmake 和删除构建文件夹无济于事。我被难住了!

感谢任何有关如何解决此问题的见解,以便我能够取得进展。

【问题讨论】:

  • 如果不从 QObject 继承、不使用 Q_OBJECT 宏并通过“moc”元对象编译器运行代码,则无法使用 Qt 的信号/插槽机制。

标签: c++ qt


【解决方案1】:

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

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

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

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

【讨论】:

  • 非常感谢,这足以让我弄清楚如何解决问题。我将 QList 的声明更改为 QList&lt;KMLFile*&gt; tracks; 并用 KMLFile *track = new KMLFile; 实例化它的对象,现在它可以正常编译了。非常感谢!
  • @SeaMouse 小心点。您需要在某一时刻删除它们。给每个KMLFile 一个父级(大概在保存列表的QObject 继承者的成员函数中)可以解决大部分问题,但是在列表被销毁之前在列表上执行qDeleteAll() 也可以解决它。
  • 感谢您的提醒 - 我忘了这样做!
【解决方案2】:

QObject 有一个已删除的复制构造函数。你的类正在创建一个编译器生成的复制构造函数。当您将 QObject 作为类的基类时,编译器为 KLMFile 生成的复制构造函数会尝试调用基类的已删除复制构造函数,这时您会收到错误。

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

如果错误中引用的行靠近 KLMFile 类的副本,这将是一个强有力的指示,表明是这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-19
    • 2017-12-04
    • 2014-09-15
    • 2021-11-13
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 2020-08-21
    相关资源
    最近更新 更多