C++派生POD类在模板事件分发中聚合初始化失败原因求解
问题诱因分析
- C++版本聚合规则限制:C17 标准才正式支持「带公有非虚基类的类」作为聚合类型使用聚合初始化。如果你的编译环境使用的是 C14 及更早的标准,
CollisionEvent因为继承了Event基类,不满足聚合类型的判定要求,自然无法使用TEvent{std::forward<Args>(args)...}的形式做聚合初始化。编译器会认为你尝试调用匹配参数的构造函数,但你没有定义对应签名的构造函数,因此抛出类型转换失败的错误。 - C++17 及以上版本的聚合初始化顺序问题:就算使用 C++17 及更高版本的标准,继承基类的聚合类型初始化时,初始化列表的参数顺序要求先传递基类的初始化参数,再传递派生类自身的成员初始化参数。你的
CollisionEvent基类Event是空类,正确的聚合初始化写法应该是CollisionEvent{{}, entityA, entityB},第一个空大括号用于初始化基类,后续两个参数初始化派生类成员。你调用DispatchEvent时只传了两个Entity参数,编译器会尝试把第一个Entity参数用来初始化基类Event,类型不匹配因此报错。 - 补充修复方案:你可以选择放开注释的
CollisionEvent带参构造函数,此时类会失去聚合属性,大括号初始化会直接匹配你定义的构造函数,不需要额外处理基类初始化,代码可以正常编译运行。
内容的提问来源于stack exchange,提问作者Luca
相关产品推荐
相关产品推荐

