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

Posted

技术标签:

【中文标题】查找“无法访问在类\'QObject\'中声明的私有成员”的根本原因【英文标题】:Find root cause of "cannot access private member declared in class 'QObject'"查找“无法访问在类'QObject'中声明的私有成员”的根本原因 【发布时间】:2013-10-09 10:03:39 【问题描述】:

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

    https://***.com/a/3513395/356726 No copy constructor or assignment operator

问题是,编译器消息总是指出类的最后一行(关闭):

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

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

备注:请注意,在您标记此副本之前。问题是关于找到根本原因,而不是像其他问题那样如何解决它。

--- 编辑 1 ---

很好的提示 Kuba 等人。是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 版本,这可能是原因吗?

【问题讨论】:

VS 哪个版本?我的(VS2010)在使用行报告错误,然后在报告的其他行上说“请参阅QObject::QObject 的声明”(指向QObject)。 你不会错过类定义的右括号 后面的; 吗? 幽默我们并发布整个错误消息,以及您的 Visual Studio 版本。请注意从何处获取消息 - VS IDE 的问题列表不是您想要的。您想在原始编译器输出中查看它。至少在 Qt Creator 上,当您单击某个问题时,问题列表会展开,让您更深入地了解发生了什么。 发布一些(最好是最少的)代码来重现问题。 【参考方案1】:

检测根本原因的最简单解决方案是将您的复制 ctor 设为私有。 (或已删除,但这在 VS2010 中尚不可能)。这将抑制自动生成的复制 ctor,这是错误的根源。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于查找“无法访问在类'QObject'中声明的私有成员”的根本原因的主要内容,如果未能解决你的问题,请参考以下文章

学习数据结构笔记 ---查找算法(线性查找,二分查找,插值查找,斐波那契查找)

数据结构 查找表的顺序查找折半查找插值查找以及Fibonacci查找

查找算法

常见的查找算法

数据结构查找---有序表查找(三种查找方式:折半,插值,斐波拉契查找)

静态查找表:顺序查找折半查找分块查找