2016-06-12 1294 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