2013-07-22 3 views
1

У меня обугленного вектор собр и вектор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

Try Добавить() в между 'arrnode.push_back (((arr [j] == '(')? ({1,1}): ({- 1, -1}))); ' Надеюсь, что эта помощь –

+0

@SatishBejgum Нет, это не так. ошибка компилятора. –

+0

Вместо этого вы можете использовать 'arr [j] == '(')? (node) {1,1}: (node) {- 1, -1}', но я не уверен он стандартный (напоминает мне к C99, а C99 - не C++ ...) –

ответ

4

Так, используя gcc ошибки вы увидите, будет выглядеть примерно так:

error: expected primary-expression before ‘{’ token 

Он ожидает выражение, но {} s не являются выражение, они просто использовать для инициализации списка в некоторых местах, как указано разделом 8.5.4 в draft standard, в котором говорится:

... Список инициализация может использоваться

- как инициализаторе в определение переменной (8,5)

- как инициализаторе в новом выражении (5.3.4)

- в ответном заявлении (6.6.3)

....

Не указано conditional operator. Как утверждают другие, альтернативой является использование заявления if. Хотя, как Джеймс указывает, что это не может быть идеальной замены, так что если вы чувствуете, что conditional operator работает лучше в вашем контексте то, как Джеймс предлагает использовать только следующие:

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

И другие указали неправильно .Улучшен ли 'if' или условный оператор, зависит от контекста, в этом случае важной является« push_back »(безусловный), поэтому это должно быть доказано, а не читателю, имеющему alyze две ветви, только чтобы обнаружить, что они делают то же самое. –

+0

@JamesKanze Это справедливый аргумент, я поменял свой ответ. –

1

с синтаксисом не позволяет. И как это могло быть: что такое тип от { 1, 1 }? (. Компилятор должен определить типы в условное выражение)

Вместо того, чтобы фантазии, почему бы просто не написать:

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

Это яснее, когда вы заявляете тип явно не только для компилятор , но для человека читателя.

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 не имеет типа.

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