2013-03-19 98 views
1

我在我的程序中使用了以下結構。C++發生結構錯誤,爲什麼不允許這樣做?

struct terminator{ 
    int id; 
    string type; 
    union{ 
     terminator *next; 
     int empty; 
    }; 
}; 

在主,我有以下代碼:

int main(){ 
    terminator root = {0, "", NULL}; 
    root = {0, "", NULL}; //NOT ALLOWED WHY? Trying to set to its original value. 
} 

這提供了以下錯誤信息:

g++ lab8.cc -std=c++11 
lab8.cc: In function 'int main()': 
lab8.cc:78:21: error: no match for 'operator=' in 'root = {0, "", 0}' 
lab8.cc:78:21: note: candidates are: 
lab8.cc:6:8: note: terminator& terminator::operator=(const terminator&) 
lab8.cc:6:8: note: no known conversion for argument 1 from '<brace-enclosed in 
itializer list>' to 'const terminator&' 
lab8.cc:6:8: note: terminator& terminator::operator=(terminator&&) 
lab8.cc:6:8: note: no known conversion for argument 1 from '<brace-enclosed in 
itializer list>' to 'terminator&&' 

但是,這是確定的,而不是:

int main(){ 
    terminator root = {0, "", NULL}; 
    root = *(new terminator); 
    root.id=0; 
    root.type=""; 
    root.next=NULL; 
} 

爲什麼這是嗎?任何方式來解決它?

回答

3

在第一種情況下,你是初始化結構。

在第二種情況下,您正在嘗試賦值給已聲明的變量,除非您的編譯器支持將複合文字作爲擴展名,否則不起作用。 (即使是這樣,你需要寫

root = (terminator){ 0, "", NULL }; 

實際上使它工作。)

如果你可以使用C++ 11(這好像你這樣做),你也可以採取所謂的「初始化列表」的新功能的優勢,其運動類似的語法:

root = terminator{ 0, "", NULL }; 
+1

與該問題沒有直接關係,但在C++ 11中,'NULL'的使用已被棄用,以支持'nullptr'。 – Gorpik 2013-03-19 09:09:39

+0

@Gorpik這很有趣。謝謝(你的)信息! – 2013-03-19 09:10:10

2

你需要告訴編譯器的RHS是terminator類型:

root = terminator{0, "", NULL}; 
+0

。 – ecatmur 2013-03-19 09:04:31

+0

哦,我明白了。沒有注意到'-std = C++ 11'標誌。我的錯。 – 2013-03-19 09:05:12

1

terminator root = {0, "", NULL};做集合初始化,這是允許在沒有一個構造函數的構造形式。 =這並不意味着分配。在C++ 11可以使用支架語法構建terminator類型的匿名臨時對象,然後可以將分配給root:@ H2CO3 OP是使用C++編譯器11

root = terminator{0, "", nullptr};