You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 13:24:54