条件运算符不能使用混合数据类型,因此:
bool cond = true;
cout << (cond?1:2) << endl;
cout << (cond?"msg1":"msg2") << endl;
cout << (cond?1:"msg") << endl;
在最后一行,我收到此错误消息:
错误:不兼容的操作数类型('int'和'const char *')
有没有办法在这样的语句中混合使用单行代码的不同类型?我需要将它放在预处理器宏中。
编译:clang 3.5
答案 0 :(得分:2)
这个问题是什么? :运算符导致赋值操作,因此它只能将值赋值给单个类型,并且在编译时不可能确定应该使用哪种类型,因为代码分支就好像使用了if语句一样。想象一个方法,在一个案例中返回一个字符串,在另一个案例中返回一个int,这是不可能的。你可以做的就是从莫斯科建议的@Vlad中找出类型。
答案 1 :(得分:1)
对于最后一个语句,您可以确定常见类型,如std::string
。
例如
std::cout << ( cond ? std::to_string( 1 ) : "msg" ) << std::endl;
答案 2 :(得分:1)
&lt;&lt;对于不同的数据类型,运算符被重载,并且在编译代码时,编译器确定要调用的重载函数。这就是为什么你不能拥有一个返回不同可能数据类型的函数的原因:编译器无法通过这种方式选择正确的重载。
因此,请将(cond?result1:result2)视为一个只需要一个返回类型的函数,就像任何其他函数一样。
如果您更清楚地说明您正在尝试做什么,可能更容易帮助您!
干杯
答案 3 :(得分:1)
语句(cond?1:"msg")
在编译期间它会导致失败。
让a = (cond?1:"msg")
编译器会将此表达式翻译为类似于此
if cond then
a = 1
else
a ="msg"
我们可以看到分配给a
的值的类型从if更改为else。
但如果您使用支持类型更改的动态语言,那么它将是有效的。
所以你应该使用
cout<<(cond?std::to_string( 1 ):"msg");