C++构造初始化列表报'Enemy' does not refer to a value错误排查
报错根因
两个编译错误都来自无参Room构造函数的委托调用写法错误:
// 错误写法 Room::Room() : Room{Enemy Goblin{"Goblin"}}{ }
你在给委托构造传参的表达式位置,写了命名变量的声明语法。在表达式上下文中创建临时类对象时,只需要写类名{构造参数}即可,不需要给临时对象指定变量名——只有在声明作用域内可访问的命名变量时,才需要写类名 变量名{构造参数}的格式。
加了多余的Goblin变量名后,编译器会把这段内容识别成变量声明而非传参表达式,因此抛出两个对应错误:
'Enemy' does not refer to a value:表达式位置需要可传值的对象,不识别类型声明error: expected primary-expression before 'Goblin':Goblin出现在表达式非法位置,不符合语法规则
这个错误逻辑和普通函数传参是一致的:比如你给接收int参数的函数传值时,不能写func(int num{1}),只能写func(1)或者func(int{1})。
修复方案
删掉多余的临时对象变量名即可,修改后的无参构造代码:
Room::Room() : Room{Enemy{"Goblin"}}{ }
由于你的Enemy类已经实现了接收单个std::string参数的构造函数,这里还可以简化写法,编译器会自动完成隐式类型转换构造临时对象:
Room::Room() : Room{"Goblin"}{ }
额外排查提示
你在Room类中定义了Chest chest;成员,但目前两个Room构造函数的初始化列表都没有显式初始化该成员。如果你没有给Chest类实现默认无参构造函数,后续编译会触发「没有合适的Chest默认构造函数」类的报错,记得提前给Chest补上默认构造,或者在Room构造的初始化列表里显式给chest传参初始化。
相关学习方向
- C++ 临时对象的创建语法与生命周期
- 构造函数初始化列表、委托构造的语法规则
- 类成员的初始化顺序与要求
- 隐式类型转换与转换构造函数的规则
内容的提问来源于stack exchange,提问作者DJNASTY
相关产品推荐
相关产品推荐

