C++静态结构体成员触发隐式删除默认构造函数错误排查
编译错误解决:默认构造函数被删除问题
编译错误信息
<source>:48:32: error: use of deleted function 'FPTask_sim::Data_T::Data_T()' 48 | FPTask_sim::Data_T FPTask_sim::_data; | ^~~~~ <source>:40:9: note: 'FPTask_sim::Data_T::Data_T()' is implicitly deleted because the default definition would be ill-formed: 40 | } Data_T; | ^~~~~~
问题复现代码
注释掉#define BREAK_EVERYTHING后代码可正常编译:
#define BREAK_EVERYTHING namespace tinyfsm { struct Event {}; } namespace EventConsts { struct EventCode_T {}; struct Event_T {}; struct EventStruct_T : tinyfsm::Event { #ifdef BREAK_EVERYTHING EventStruct_T(const Event_T& Event); #else struct Event { }; #endif }; } class FPTask_sim { public: FPTask_sim(); typedef struct { tinyfsm::Event ARG_react_01_unused_arg01; EventConsts::EventStruct_T ARG_react_02_unused_arg01; // 这些行是问题根源 EventConsts::EventStruct_T ARG_dispatch_e; // 这些行是问题根源 } Data_T; static Data_T _data; static Data_T _call_data; }; FPTask_sim::Data_T FPTask_sim::_data; int main() { bool exampleVariable; }
问题分析
推测错误由EventStruct_T(const Event_T& Event);导致:当显式声明带参数的构造函数后,C++编译器会自动删除类的默认无参构造函数。而静态对象_data的初始化需要调用Data_T的默认构造函数,Data_T包含EventStruct_T成员,由于后者的默认构造函数已被删除,Data_T的默认构造函数也被编译器隐式删除,最终触发编译错误。
补充代码说明
之前遗漏了EventStruct_T的拷贝构造函数实现,用于将Event_T对象拷贝到EventStruct_T。我理解需要在声明对象时赋值,或者添加空的默认构造函数,这个思路是否正确?
补充后的完整代码:
#define BREAK_EVERYTHING namespace tinyfsm { struct Event {}; } namespace EventConsts { struct Event_T {bool a;}; struct EventStruct_T : tinyfsm::Event { bool a; #ifdef BREAK_EVERYTHING //EventStruct_T(){} // 手动实现默认构造函数? EventStruct_T() = default; // 可行的解决方法 EventStruct_T(const Event_T& Event); #else struct Event { }; #endif }; } class FPTask_sim { public: FPTask_sim(); typedef struct { tinyfsm::Event ARG_react_01_unused_arg01; EventConsts::EventStruct_T ARG_react_02_unused_arg01; // 这些行是问题根源 EventConsts::EventStruct_T ARG_dispatch_e; // 这些行是问题根源 } Data_T; static Data_T _data; static Data_T _call_data; }; FPTask_sim::Data_T FPTask_sim::_data; int main() { bool exampleVariable; }
单独文件中的构造函数实现:
// 单独文件中的当前构造函数 EventConsts::EventStruct_T::EventStruct_T(const EventConsts::Event_T& Event) : a(Event.a) {}
修复方案
你的理解完全正确,有两种可行的修复方式:
方式1:显式添加默认构造函数
在EventStruct_T中补充默认构造函数,推荐用=default让编译器生成标准默认版本,也可以手动初始化成员:
// 推荐方式:让编译器生成默认构造函数 EventStruct_T() = default; // 或者手动实现(适合需要初始化成员的场景) EventStruct_T() : a(false) {}
这种方式直接解决EventStruct_T无默认构造函数的问题,让Data_T的默认构造函数可以正常调用成员构造函数。
方式2:静态对象初始化时显式赋值
如果不想修改EventStruct_T,可以在定义_data时,显式初始化所有成员:
// 先创建用于初始化的Event_T对象 EventConsts::Event_T init_event{false}; FPTask_sim::Data_T FPTask_sim::_data{ {}, // 初始化tinyfsm::Event成员 init_event, // 初始化ARG_react_02_unused_arg01 init_event // 初始化ARG_dispatch_e };
这种方式无需修改类定义,但需要确保每个EventStruct_T成员都有合法的初始化参数。
推荐选择
优先用方式1,=default的写法既符合C++语法规范,又能让代码简洁易维护。
内容的提问来源于stack exchange,提问作者Grant
相关产品推荐
相关产品推荐

