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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:18:21