编译器不接受三元运算符的使用

时间:2013-07-22 11:35:26

标签: c++ vector ternary-operator

我有字符向量 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部分(注释)使代码正常工作。我错过了什么? 在此先感谢并抱歉问题的破旧标题:)

4 个答案:

答案 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} ) );