C++嵌套结构体定义构造函数后聚合初始化出现转换错误如何解决
错误根本原因
- 首先C++中聚合类型才支持直接用
{}包裹成员值的聚合初始化方式,而聚合类型的核心要求之一就是没有用户自定义的构造函数。你给smallDude显式定义了无参构造函数,它已经不属于聚合类型,无法直接用{2,3}的方式初始化实例。 - 其次你当前只给
smallDude实现了无参构造函数,没有定义接收两个int参数的构造函数,编译器找不到匹配的构造函数来处理{2,3}的入参,自然就抛出转换失败的报错。
可选修复方案
方案1:保留聚合类型属性,用类内初始化设置默认值(C++11及以上版本支持)
删掉自定义的无参构造函数,直接给成员变量声明时设置默认值,smallDude仍然是聚合类型,原有聚合初始化逻辑可以正常运行:
struct smallDude { int int1 = 70; int int2 = 60; };
这种方案下,如果你不传初始化值,就会用默认的70、60,传值就用你传入的值,符合你原本的需求。
方案2:新增支持多参数的构造函数
给smallDude补充接收两个int参数的构造函数,可以用默认参数兼顾无参构造的需求:
struct smallDude { int int1; int int2; // 同时支持无参构造、传1个参数、传2个参数的场景 smallDude(int a = 70, int b = 60) : int1(a), int2(b) {} };
这种方案下{2,3}会自动匹配到这个构造函数完成初始化,原有main里的代码不需要修改。
内容的提问来源于stack exchange,提问作者Abdulla Masud
相关产品推荐
相关产品推荐

