使用Q_DECLARE_METATYPE注册自定义类型失败,报C2280错误求助
Q_DECLARE_METATYPE触发C2280错误的原因及解决办法
错误详情
Error C2280 'MyNamespace::MyClass::MyClass(const MyNamespace::MyClass&)': attempting to reference a deleted function
项目:BksMtRisk
文件路径:C:\qt2\5.15.2\msvc2019_64\include\QtCore\qmetatype.h 行号:825
关联代码
namespace MyNamespace { class MyClass : public AbstractMyClass { } } Q_DECLARE_METATYPE(MyNamespace::MyClass)
原因解析
Q_DECLARE_METATYPE对注册类型有硬性要求:必须支持拷贝构造和赋值操作。报错的核心是MyNamespace::MyClass的拷贝构造函数被编译器自动标记为删除状态,常见触发场景包括:
- 父类
AbstractMyClass显式删除了拷贝构造函数(例如声明AbstractMyClass(const AbstractMyClass&) = delete;) MyClass包含不可拷贝的成员(如std::unique_ptr、std::future这类独占式资源类型)- 类中定义了移动构造/移动赋值函数,C++11及以后编译器会自动删除默认拷贝构造函数
解决方案
- 修复父类的拷贝能力:如果
AbstractMyClass的拷贝构造被删除,业务允许的话恢复该函数;若无法恢复,可改为注册类的指针类型。 - 让MyClass支持拷贝:如果类内有不可拷贝成员,要么替换为可拷贝类型,要么手动实现拷贝构造函数和赋值运算符,保证拷贝逻辑合法。
- 注册指针类型:若类确实不需要或无法支持拷贝,修改注册代码为指针类型:
Q_DECLARE_METATYPE(MyNamespace::MyClass*)
内容的提问来源于stack exchange,提问作者topaz23
相关产品推荐
相关产品推荐

