查找“无法访问类'QObject'中声明的私有成员的根本原因”

时间:2013-10-09 10:03:39

标签: c++ qt copy-constructor visual-c++

我理解为什么会得到C2248: 'QObject::QObject' : cannot access private member declared in class 'QObject'。 Qt对象不可复制,如下所述:

  1. https://stackoverflow.com/a/3513395/356726
  2. No copy constructor or assignment operator
  3. 问题是,编译器消息总是指示该类的最后一行(结束}):

    class MyQObject : public QObject {
           Q_OBJECT
           ....
    }; <-- error line
    

    根本原因在其他地方,即。复制类的位置(其他文件,代码中的某些不同行)。这有时很难发现! 问题:有没有办法找到错误的真正原因

    备注:请注意,在标记此复制之前。问题是找到根本原因,而不是像其他问题那样解决问题。

    ---编辑1 ---

    良好暗示Kuba et.al.它是VS2010,在Qt Creator 2.8.0中编译

    'QObject::QObject'
            C:\Qt\5.1.0-32\qtbase\include\QtCore/qobject.h(115) : see declaration of 'QObject'
            This diagnostic occurred in the compiler generated function 'MyQObject ::MyQObject (const MyQObject &)'
    

    我想知道为什么会生成一个拷贝构造函数。我想到了一个想法,我正在使用启用DBus的Qt版本,这可能是原因吗?

2 个答案:

答案 0 :(得分:1)

检测根本原因的最简单方法是使您的副本ctor也是私有的。 (或删除,但这在VS2010中是不可能的)。这将抑制自动生成的复制ctor,它是错误的来源。

答案 1 :(得分:1)

如果您没有明确复制MyObject,但收到此错误消息,那么您与MyObject一起使用的内容正在代表您进行复制。

最可能的罪魁祸首是其中一个容器类,例如QListQVector

阅读Container class documentation以获取更多信息以及您可能正在使用的任何容器的特定类文档。所有容器都有其元素的要求,例如必须有默认构造函数,必须是可分配的等等。这就是我认为你的问题所在。