当前位置: 首页 > 知识库问答 >
问题:

使用三元条件运算符时操作数类型不兼容

韩阳成
2023-03-14

此代码:

  bool contains = std::find(indexes.begin(), indexes.end(), i) != indexes.end();
  CardAbility* cardAbility = contains ? new CardAbilityBurn(i) : new CardAbilityEmpty;
 if (contains)
 {
    cardAbility = new CardAbilityBurn(i);
 }
 else
 {
    cardAbility = new CardAbilityEmpty;
 }

我需要注意(我想您可能需要这些信息),CardabilityEmptyCardabilityBurn都是从Cardability派生出来的,所以它们可以说是兄弟。

谢谢

共有1个答案

沈运恒
2023-03-14

C++的类型系统由内而外确定表达式的类型[1]。这意味着条件表达式的类型在赋值Cardability*之前确定,编译器只能选择CardabilityBurn*CardabilityEmpty*

由于C++具有多重继承和一些更可能的转换路径,因为没有一种类型是另一种类型的超类,所以编译就止步于此。

要成功编译,您需要提供缺少的部分:将一个或两个操作数强制转换为基类类型,这样条件表达式作为一个整体就可以采用该类型。

auto* cardAbility = contains
    ? static_cast<CardAbility*>(new CardAbilityBurn(i))
    : static_cast<CardAbility*>(new CardAbilityEmpty  );

但是,它有点复杂,所以在这种情况下if-else结构更适合。

[1]有一个例外:重载函数名没有定义类型,除非您将它们(隐式或显式)转换为它们的某个版本。

 类似资料:
  • 问题内容: Netbeans说我的三元运算符不是语句。怎么会? 我尝试过if / then / else对应项,并且工作正常: 问题答案: 三元运算符中的语句必须是非空的。他们需要退货。

  • 三元运算符 三元运算符 ? 应该只用在它能让代码更加清楚的地方。 一个条件语句的所有的变量应该是已经被求值了的。类似 if 语句,计算多个条件子句通常会让语句更加难以理解。或者可以把它们重构到实例变量里面。 推荐: result = a > b ? x : y; 不推荐: result = a > b ? x = c > d ? c : d : y; 当三元运算符的第二个参数(if 分支)返回和条

  • 问题内容: 如果Python没有三元条件运算符,是否可以使用其他语言构造来模拟一个? 问题答案: 它是在2.5版中添加的。表达式语法为: 第一被评估,则恰好中的任一个a或b进行评估并返回基于所述布尔值。如果为,则被评估并返回但被忽略,否则被评估为返回但被忽略。 这允许发生短路,因为仅当评估为时才进行评估,而b根本不评估,而当为 评估时,仅当评估时就完全不评估。 例如: 注意条件是表达式,而不是语句

  • 如果Python没有三元条件运算符,是否可以使用其他语言构造来模拟一个?

  • 问题内容: 我刚刚开始学习代码(特别是Java),并且我正在测试一个密码系统,在该密码系统中,键入密码时它将变为变量“ password”,并检查其是否等于实际密码password2。这是代码: 我正在尝试检查嵌套的if语句,我输入的密码是否与password2“ Call of Duty”匹配;但问题在于它不适用于字符串。该问题的标题是出现的错误。有人可以帮帮我吗? 问题答案: 比较字符串时,应

  • 在Kotlin中,这个表达式的等价物是什么? 这不是Kotlin中的有效代码。