2016-06-12 35 views
7

以前はTDM-GCC-5.10を使用していましたが、4.9 MINGW-GCCに戻ってリストを使用しようとすると、 -initialization:は{brace-enclosed initializer list>から{brace-enclosed initializer list>からstructに変換できませんでした

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

質問に「メイン」はありません。 [ask]を参照し、[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

g ++ 4.8.4とオプション '-std = C++ 11'。テストの 'x'宣言に(偶然に)' = 0'を削除しました。明らかにそれを追加すると、コンパイラエラーが発生します。 – jpo38

+0

はここでうまくいくようです:https://ideone.com/0GwoBo – RyanP

関連する問題