这段代码:
bool contains = std::find(indexes.begin(), indexes.end(), i) != indexes.end();
CardAbility* cardAbility = contains ? new CardAbilityBurn(i) : new CardAbilityEmpty;
给我以下错误:
不兼容的操作数类型CardAbilityBurn和CardAbilityEmpty
但是,如果我写这样的代码:
if (contains)
{
cardAbility = new CardAbilityBurn(i);
}
else
{
cardAbility = new CardAbilityEmpty;
}
然后编译器不介意 . 为什么这样?我想使用三元条件运算符,因为它只是一行 . 那有什么不对?
我需要注意(我认为你可能需要这些信息) CardAbilityEmpty
和 CardAbilityBurn
都来自 CardAbility
所以他们这么说兄弟 .
谢谢
2 回答
C 's type system determines expressions'类型由里到外[1] . 这意味着条件表达式的类型是在分配给
CardAbility*
之前确定的,并且编译器必须只选择CardAbilityBurn*
和CardAbilityEmpty*
.由于C具有多重继承和一些可能的转换路径,因为没有一个类型是另一个类型的超类,编译就会停止 .
要成功编译,您需要提供缺少的部分:将一个或两个操作数强制转换为基类类型,因此条件表达式作为一个整体可以采用该类型 .
(注意使用auto,因为您已经在右侧表达式中提供了目标类型 . )
然而,它有点复杂,所以最终
if
-else
结构在这种情况下更适合 .[1]有一个例外:重载函数名称在将它们(隐式或显式)转换为其中一个版本之前没有确定类型 .
有several cases described for Microsoft compilers,如何处理操作数类型 .
然后有一个警告:
也许这就是原因,Apple在LLVM中停用了这种隐式转换 .
所以,如果/ else似乎更适合你的情况 .