1

我有一个char 向量 arr和一个向量 arrnode,其元素为node。以下是代码:

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

4 回答 4

4

因此,使用gcc您看到的错误将如下所示:

error: expected primary-expression before ‘{’ token

它期待一个表达式,但{}s 不是一个表达式,它们仅可用于标准草案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 ) );
于 2013-07-22T12:03:50.093 回答
1

语法不允许。它怎么可能:什么是类型{ 1, 1 }?(编译器必须确定条件表达式中的类型。)

与其花哨,不如直接写:

arrnode.push_back( arr[j] == '(' ? node( 1, 1 ) : node( -1, -1 ) );

当您显式声明类型时会更清楚,不仅对于编译器,对于人类读者也是如此。

于 2013-07-22T12:08:29.873 回答
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没有类型。

于 2013-07-22T12:08:54.210 回答
0

在 C 中你会写:

 arrnode.push_back( ( ( arr[j]=='(' ) ? (node){1,1} : (node){-1,-1} ) );

但是在 C++ 中不允许使用“复合文字”,因此您可以编写:

 arrnode.push_back( ( ( arr[j]=='(' ) ? node{1,1} : node{-1,-1} ) );
于 2013-07-22T12:13:24.770 回答