以下代码:
#include <iostream>
using namespace std;
struct A{int number=10;};
int main()
{
A* a = new A();
cout<<"A val: "<< a==nullptr?"":a->number<<endl;
}
使用c ++ 11在gcc 4.7上编译:
错误:类型&#39; int&#39;的操作数无效和&#39;&#39;到二进制&#39;运算符&lt;&lt;&lt;&#39;
我不明白为什么,这样做的正确方法是什么?我希望尽可能缩短空检,因为我希望它们非常普遍。
答案 0 :(得分:3)
首先:是的,您可以将三元运算符用于std::ostream
,但请注意运算符优先级。如果你打算这样做,你需要做这样的事情:
cout << "My name is: " << (my != nullptr ? my->name() : "don't know") << '\n';
换句话说,将三元表达式封装在括号中。
其次,第二个和第三个操作数必须可以转换为相同的类型。换句话说,您的示例无法正常工作,因为您尝试插入字符串文字(""
),如果a
为空,或者实际数字(a->number
,则为类型int
)如果a
不为空。
第三,您需要修复语法。但是@quamrana已经解决了那个问题。
答案 1 :(得分:1)
您发现运算符<<
的绑定方式与您预期的不同。
使用:
cout << "A val: " << (a==nullptr ? "" : a->number) << endl;
(或者你刚刚打错并错过了:
的{{1}})