编译器错误 C2248:“QObject::Qobject”:无法访问在类“QObject”中声明的私有成员

Posted

技术标签:

【中文标题】编译器错误 C2248:“QObject::Qobject”:无法访问在类“QObject”中声明的私有成员【英文标题】:compiler error C2248:'QObject::Qobject':cannot access private member declared in class 'QObject' 【发布时间】:2014-11-18 23:09:30 【问题描述】:

大家好,我有一个 foo 类

foo.h 中的代码

namespace GUI

class Foo : public QObject

Q_OBJECT

public:
explicit Foo(QObject *parent = 0);
virtual ~Foo();
....


;

现在这工作和编译正常,但我想使用 QSettings 保存这个自定义 c++ 类,其中一个步骤是使用 Q_DECLARE_METATYPE 注册你的类

因此,我一放这条线 Q_DECLARE_METATYPE(Foo) 在我的 foo.h 文件的末尾,我得到这些编译器错误 C2248:'QObject::Qobject':cannot access private member 在类 'QObject' 中声明,单击它时只会将我带到我的 connection.h 头文件的最后一行并且没有提供关于可能出现什么问题的其他信息,即错误指向我

  Class Foo
  

  ;<---- point me here
  Q_DECLARE_METATYPE(Foo)

我知道 QObject 不能被复制,这与它有关,但我不知道这里可能有什么问题以及如何纠正它。 提前致谢

【问题讨论】:

【参考方案1】:

我知道 QObject 不能被复制,这与它有关,但我不知道这里可能有什么问题以及如何纠正它。

相关的。 Q_DECLARE_METATYPE 要求你的类型是可复制的,但你的类型继承自 QObject,所以你不能这样做。当然,您可以改为 Q_DECLARE_METATYPE(Foo*),但我认为您应该将设置移动到单独的值类中,然后您可以使用 QSettings 保存。

【讨论】:

非常感谢您的工作,顺便说一句,您是否建议我应该使用 Qsettings 保存我需要保存的所有成员变量的新结构,而不是在我的连接中拥有该结构的成员变量class.And 该结构不会继承自 QObject 是的,完全正确。然后,您可以创建一些功能来从设置中保存/恢复该结构的实例。【参考方案2】:

确保您的Q_DECLARE_METATYPE 语句在您的命名空间之外,并且您完全限定了您的类名。有关详细信息,请参阅Q_DECLARE_METATYPE 文档。

namespace GUI


class Connection : public QObject

    ...
;



Q_DECLARE_METATYPE(GUI::Connection)

【讨论】:

【参考方案3】:

我知道 QObject 不能被复制,这与它有关,但我 不知道这里可能出了什么问题,我该如何纠正它。

所以声明一个拷贝构造函数,就可以了。

...
Foo(const Foo &_other);
...

【讨论】:

以上是关于编译器错误 C2248:“QObject::Qobject”:无法访问在类“QObject”中声明的私有成员的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 2012 中编译启用 CLR 的 C++ 项目时出现 C2248 错误

qt 环境下mapx组件打包后编译产生c2248和c2512错误

CObject、CStringArray 和错误 C2248

错误:C2248:“QVariant::QVariant”:无法访问在“QVariant”类中声明的私有成员

命名空间内的错误 c2248 朋友类

“错误C2248:'CObject :: CObject':无法访问在类'CObject'中声明的私有成员[重复]