1

char ベクトル arrと、その要素をnodeとして持つベクトル 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

4 に答える 4

4

したがってgcc、表示されるエラーを使用すると、次のようになります。

error: expected primary-expression before ‘{’ token

式が必要ですが、 s は式ではありません。ドラフト標準のセクションで{}指定されているように、いくつかの場所でリストの初期化に使用できます。8.5.4

... リストの初期化を使用できます

— 変数定義の初期化子として (8.5)

— 新しい式の初期化子として (5.3.4)

— return ステートメント (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 に答える