我有字符向量 arr 和向量 arrnode ,其元素为节点。以下是代码:
struct node
{
int min;
int sum;
};
vector<char> arr;
char c;
for(int j = 0; j < n; j++)
{
cin >> c;
arr.push_back(c);
}
vector<node> arrnode;
for(int j = 0; j < n; j++)
{
/* if(arr[j]=='(')
arrnode.push_back({1,1});
else
arrnode.push_back({-1,-1});*/
arrnode.push_back( ( ( arr[j]=='(' ) ? {1,1} : {-1,-1} ) );
}
此代码为使用三元运算符的行提供以下错误。
prog.cpp:68:49: error: expected ‘:’ before ‘{’ token
prog.cpp:68:49: error: expected primary-expression before ‘{’ token
然而,if-else部分(注释)使代码正常工作。我错过了什么? 在此先感谢并抱歉问题的破旧标题:)
答案 0 :(得分:4)
因此,使用gcc
您看到的错误将会是这样的:
error: expected primary-expression before ‘{’ token
期望表达式,但{}
不是表达式,它们只适用于draft standard部分8.5.4
指定的某些地方的列表初始化,其中说明:
...可以使用列表初始化
- 作为变量定义中的初始化器(8.5)
- 作为新表达式(5.3.4)中的初始化器
- 在一份退货声明(6.6.3)
中...
它没有列出conditional operator
。正如其他人所说,另一种选择是使用if
语句。虽然詹姆斯指出这可能不是理想的替代品,但如果你认为conditional operator
在你的背景下效果更好,那么詹姆斯建议只使用以下内容:
arrnode.push_back( arr[j] == '(' ? node( 1, 1 ) : node( -1, -1 ) );
答案 1 :(得分:1)
语法不允许。它怎么可能:类型是什么
{ 1, 1 }
的? (编译器必须确定其中的类型
条件表达式。)
为什么不写下来,而不是幻想,
arrnode.push_back( arr[j] == '(' ? node( 1, 1 ) : node( -1, -1 ) );
当您明确说明类型时,它更清楚,不仅仅是 编译器,但对于人类读者。
答案 2 :(得分:1)
问题是在三元运算符中编译不能告诉类型,它只是一个初始化器,所以你需要
arrnode.push_back((arr[j]=='(')? node({1,1}) : node({-1,-1}));
您的构造与if
不同,它更像是
if(arr[j]=='(')
x={1,1};
else
x={-1,-1};
arrnode.push_back(x);
x
没有类型。
答案 3 :(得分:0)
在C中你会写:
arrnode.push_back( ( ( arr[j]=='(' ) ? (node){1,1} : (node){-1,-1} ) );
但是在C ++&#34;复合文字&#34;是不允许的,所以你可以写:
arrnode.push_back( ( ( arr[j]=='(' ) ? node{1,1} : node{-1,-1} ) );