2013-07-22 43 views
1

我有一個炭載體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

嘗試添加()在 之間'arrnode.push_back (((arr [j] =='(')?({1,1}):({ - 1,-1})));' 希望得到這個幫助 –

+0

@SatishBejgum不,不。編譯器錯誤 – 2013-07-22 11:39:46

+0

你可以做的是'arr [j] =='(')?(node){1,1}:(node){ - 1,-1}',但我不確定它是標準的(提醒我到C99複合文字,而C99不是C++ ...) – 2013-07-22 11:40:45

回答

4

因此,使用gcc看到錯誤看起來像這樣的破舊稱號遺憾:

error: expected primary-expression before ‘{’ token 

它期待一個表達,但{} s爲不是表達,由draft standard8.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)); 
+0

其他人指出錯誤。「if」還是條件運算符更好取決於上下文;在這種情況下,重要的是「push_back」(無條件),所以應該將其作爲證據,而不是讀者不得不分析兩個分支,發現他們完全一樣。 –

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