程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了gcc 上的错误不是 clang:无法从“<brace-enclosed initializer list>”转换为“std::vector<>大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决gcc 上的错误不是 clang:无法从“<brace-enclosed initializer list>”转换为“std::vector<>?

开发过程中遇到gcc 上的错误不是 clang:无法从“<brace-enclosed initializer list>”转换为“std::vector<>的问题如何解决?下面主要结合日常开发的经验,给出你关于gcc 上的错误不是 clang:无法从“<brace-enclosed initializer list>”转换为“std::vector<>的解决方法建议,希望对你解决gcc 上的错误不是 clang:无法从“<brace-enclosed initializer list>”转换为“std::vector<>有所启发或帮助;

以下代码仅在使用 gcc 时会产生错误:

Could not convert '{{"John",32},{"Theo",23},{"Aun",43},{"VivIEn",67}}' from '<brace-enclosed initializer List>' to 'std::vector<Person>'
                                 {"VivIEn",67}};
#include <vector>

struct Person{
    //const char* name; // <-- Compiles in both gcc and clang
    char name[32];      // <-- Error in gcc only
    int age;
};

int main(){
    std::vector<Person> parr1 = {{"John",67}};
    return 0;
}

(https://godbolt.org/z/1qEaaqcaC)

这是什么原因? 有没有办法让char数组版本用gcc编译?

我正在使用 gcc 8.3 和最新的 clang 进行测试。

解决方法

这可能是由于文字字符串是 const char*char[],因此没有隐式构造函数,可能不知道正确的聚合初始值设定项,如果您想快速编译它GCC,请执行以下任一操作:

std::vector<Person> parr1 = {
    Person {"John",32},Person {"Theo",23},Person {"Aun",43},Person {"Vivien",67}
};

第一个答案使用显式聚合初始化来确保在编译时知道类型。另一种选择是:

struct Person{
    const char* name;
    int age;
};

int main(){
    std::vector<Person> parr1 = {
        { "John",32 },{ "Theo",23 },{ "Aun",43 },{ "Vivien",6 }
    };
    return 0;
}

这只是确保聚合初始化不需要类型转换。

大佬总结

以上是大佬教程为你收集整理的gcc 上的错误不是 clang:无法从“<brace-enclosed initializer list>”转换为“std::vector<>全部内容,希望文章能够帮你解决gcc 上的错误不是 clang:无法从“<brace-enclosed initializer list>”转换为“std::vector<>所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:gcc