尝试初始化结构向量时出现编译错误

Posted

技术标签:

【中文标题】尝试初始化结构向量时出现编译错误【英文标题】:Compilation error when trying to initialize vector of structs 【发布时间】:2020-01-08 09:28:11 【问题描述】:

我正在尝试初始化结构向量,但出现编译错误。

就我的理解而言,当 struct 包含简单的数据类型(如 int、float 等)时,初始化 struct 的向量很容易,但如果我里面有多个 char 数组怎么办?

#include <vector>

/// this compiles without any problem:
typedef struct TEST_TYPE_A

    int a;
    int b;
    int c;
    int d;
;

std :: vector <TEST_TYPE_A> TEST_A =

    1,2,1,2,
    4,5,6,4,
    7,8,8,9,
    0,1,10,11,
    3,4,99,200
;/// so far good, no compilation error


/// this variant fails
typedef struct TEST_TYPE_B

    int a;
    int b;
    char txt1[10];
    char txt2[3];
;

std :: vector <TEST_TYPE_B> TEST_B =

    1,2,"1010101111","ABC",
    4,5,"1010101111","ABC",
    7,8,"1010101111","ABC",
    0,1,"1010101111","ABC",
    3,4,"1010101111","ABC"
; /// i get compilation error here

编译错误:

error: could not convert '1, 2, "1010101111", "ABC", 4, 5, "1010101111", "ABC", 7, 8, "1010101111", "ABC", 0, 1, "1010101111", "ABC", 3, 4, "1010101111", "ABC"' from '<brace-enclosed initializer list>' to 'std::vector<TEST_TYPE_B>'

我在这里看到了类似的问题,string 类型而不是 char[NUM] 数组似乎正在工作。我知道,由于我正在初始化数组,因此需要一些特殊处理,但我不知道如何尽可能简单地做到这一点。我不会假装我受过足够的教育,只是问有什么问题,我该如何解决? 我正在使用 GCC 5.1 和 C++11。

【问题讨论】:

"ABC" 是一个const char[4](有一个最终的\0),所以,与char txt2[3] 不兼容。 你的typedefs 是多余的 你为什么不使用std::string?顺便说一句,不要写std :: vector,除此之外,当你想找到std::vector时,它会杀死任何搜索功能@ @jarod42 谢谢,这是一个错字。我试图创建问题的简单示例。但问题仍然存在。 带有ALL_CAPITAL_LETTERS 的标识符(如TEST_TYPE_A)通常用于宏。 【参考方案1】:

使用 std::string 代替 c 风格的以空值结尾的数组。 std::string 不太容易出错,通常没有理由避免它。

#include <vector>
#include <string>

struct TEST_TYPE_B

    int a;
    int b;
    std::string txt1;
    std::string txt2;
;

std::vector <TEST_TYPE_B> TEST_B =

    1, 2, "1010101111", "ABC",
    4, 5, "1010101111", "ABC",
    7, 8, "1010101111", "ABC",
    0, 1, "1010101111", "ABC",
    3, 4, "1010101111", "ABC"
;

Compiles fine

如果你想继续使用char[],并且数组足够大以容纳文本,编译器似乎不同意代码是否有效(clang 编译它,gcc 没有)。但他们都同意这种形式:

std::vector <TEST_TYPE_B> TEST_B =

    TEST_TYPE_B1, 2, "1010101111", "ABC",
    TEST_TYPE_B4, 5, "1010101111", "ABC",
    TEST_TYPE_B7, 8, "1010101111", "ABC",
    TEST_TYPE_B0, 1, "1010101111", "ABC",
    TEST_TYPE_B3, 4, "1010101111", "ABC"
;

【讨论】:

固定大小的数组也有它的用处,如果 txt1 必须正好(或最多)10 个字符,char[10]std::array&lt;char, 10&gt; 比 std::string 更适合。 @Ayxan 这个解决方案在工作时不可用,因为现在对我来说。我正在开发的程序从纯 C 开始,并经历了不断变化的需求。现在它是 C++,但部分是用 C 编写的。在这个开发阶段,我无法承受将其修改为纯 C++ 的费用,相信我它会解决很多问题。我只需要以某种方式完成它。 @Jarod42 究竟为什么 std::array&lt;char, 10&gt; 更合适?比较难打印,用std::array来表示文字比较少见,这个例子won't compile搭配std::array 如果 nul 终止,text.data(),否则仍然存在 std::string_view(begin(text), end(text)),因此打印不是问题。初始化确实更难,但是,如果我们在初始化数组时使用超过 10 个字符,一些编译器会发出警告,而 std::string 很乐意接受比预期长的字符串。例如,OP 的类型可能表示具有固定大小字符串的格式。我没有说在一般情况下 std::string 不是更好,我说在特定情况下,不一定是最好的。同样,std::array 的使用量超过了std::vector【参考方案2】:

TEST_TYPE_B 的 txt1 和 txt2 成员实际上是数组。因此,要按照您现在的方式初始化它们,您必须将其更改为这个(只是为第一个 TEST_TYPE_B 做的):

std :: vector <TEST_TYPE_B> TEST_B =

    1,2,'1','0','1','0','1','0','1','1','1','1','A','B','C'
; 

但是,其他答案已经涵盖了比这样做更好的方法。我主要添加了这个答案来解释你的代码到底有什么问题。您可能应该将 txt1 和 txt2 更改为 std::string,就像 Ayxan 提供的答案一样。

【讨论】:

以上是关于尝试初始化结构向量时出现编译错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试访问二维向量元素时出现段错误

尝试在类构造函数中初始化 std::thread 时出现编译器错误 C2064 [重复]

实现结构列表时出现 C2676 编译错误

创建函数变体向量时出现“调用没有匹配函数”错误

调用将对象向量作为参数的函数时出现链接错误

尝试编译函数时出现语法错误