【问题标题】:could not convert {...} from <brace-enclosed initializer list> to struct无法将 {...} 从 <brace-enclosed initializer list> 转换为 struct
【发布时间】:2023-03-17 04:14:01
【问题描述】:

我以前使用过 TDM-GCC-5.10,现在切换回 4.9 MINGW-GCC,尝试使用列表初始化时遇到了奇怪的错误:

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。怎么了?

【问题讨论】:

  • 问题中没有main。请参阅How to Ask 并提供minimal reproducible example
  • @Olaf 已编辑,只需复制并尝试运行即可。
  • 回滚到以前的版本。如果该编辑删除了该答案的上下文,则一旦有了答案,您就不应编辑该问题。您可以附加一个解释,但如果明确标记为这样。
  • 但答案毫无意义,因为它与问题无关。
  • @Olaf:我不同意。按照这个逻辑,如果有人回答有错字,任何有错字的问题都应该保留。

标签: c++ gcc struct initialization


【解决方案1】:

问题出在这里:

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

直到最近,默认成员初始值设定项阻止类成为聚合,因此您不能对它们使用聚合初始化。 gcc 4.9 在这里仍然执行旧规则,而 gcc 5 使用新规则。

【讨论】:

  • 难以置信,这甚至会影响前向兼容性。他们不应该做这个改变!还有一个问题,这与 VC2017 完美配合!
  • @DrumM 我不明白评论 - 什么会影响兼容性?什么改变是不应该做的?
  • 就像你说的,当类不再是聚合时,不会生成默认构造函数。也许说“它不向前兼容”是错误的,因为我们正在使用一项新功能。但是在我看来,规范是一团糟,如果你在成员上指定默认初始化,为什么还需要实现默认构造函数......没有意义。
  • @DrumM 嗯? Test 这里有一个默认构造函数。你还需要实现什么?
  • @DrumM “就像你说的,当类不再是聚合时,不会生成默认构造函数” - 我从来没有这么说过。
【解决方案2】:

您在类定义之后和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;
}

【讨论】:

  • 抱歉刚刚添加了它们,您使用哪个编译器版本和标准?而这并不是失踪造成的; (我只在这个例子中忘记了)TDM-GCC 编译器一切正常。
  • g++ 4.8.4 带有选项-std=c++11。请注意,我还(意外地)将 = 0 删除到了 Test 的 x 声明中。添加它显然会导致编译器错误。
  • 看起来我的编译器有问题,如果我删除它编译的任何方言选项,但使用 c++11/c++14 它会给我带来这个错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
相关资源
最近更新 更多