2016-06-12 360 views
7

我以前使用過TDM-GCC-5.10,現在切換回4.9 MINGW-GCC,並嘗試使用列表出現奇怪的錯誤-initialization:無法將{...}從<brace-enclosed initializer list>轉換爲結構

class Vector2 
{ 
public: 
    Vector2(float x, float y) 
    { 
     this->x = x; 
     this->y = y; 
    } 
    float x = 0.f; 
    float y = 0.f; 
}; 

struct Test 
{ 
    int x = 0; 
    Vector2 v; 
}; 

int main() 
{  
    Test tst = {0,Vector2(0.0f,0.0f)}; //Error 
    return 0; 
} 

錯誤:

main.cpp: In function 'int main()': 
main.cpp:21:41: error: could not convert '{0, Vector2(0.0f, 0.0f)}' from '<brace-enclosed initializer list>' to 'Test' 
     Test tst = {0,Vector2(0.0f,0.0f)}; //Error 
             ^

我用C++ 14與兩個編譯器。哪裏不對?

+0

問題中沒有'main'。看[問]並提供[mcve]。 – Olaf

+0

@Olaf編輯,只需複製並嘗試運行它。 –

+0

回滾到以前的版本。如果該編輯刪除了該答案的上下文,則一旦有答案,就不應該編輯問題。你可以附加一個解釋,但如果明確標記爲這樣的話。 – Olaf

回答

12

的問題是在這裏:

struct Test 
{ 
    int x = 0; // <== 
    Vector2 v; 
}; 

直到最近,默認成員初始化防止類被聚集,所以你不能對他們使用集合初始化。 Gcc 4.9仍然在這裏實現舊規則,而gcc 5則使用新規則。

0

您在班級定義之後和int x = 0之後錯過了;。然後你有很多錯誤,顯然只考慮最後一個。但你的編譯器很困惑,因爲Vector2沒有定義(由於缺少;)。

這編譯:

int main() 
{ 
    class Vector2 
    { 
    public: 
     Vector2(float x, float y) 
     { 
      this->x = x; 
      this->y = y; 
     } 
     float x = 0.f; 
     float y = 0.f; 
    }; 

    struct Test 
    { 
     int x; 
     Vector2 v; 
    }; 

    Test tst = {0,Vector2(4,5)}; 
    return 0; 
} 
+0

對不起,剛添加它們,你使用哪種編譯器版本和標準?這不是由於失蹤造成的; (我只在這個例子中忘記了),TDM-GCC編譯器一切正常。 –

+0

使用選項'-std = C++ 11'的g ++ 4.8.4。請注意,我還(意外)將'= 0'移除到Test的'x'聲明。添加它顯然會導致編譯器錯誤。 – jpo38

+0

在這裏看起來不錯:https://ideone.com/0GwoBo – RyanP

相關問題