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

时间:2019-09-05 13:02:55

标签: c++ c++11

我正在尝试初始化结构的向量,并且遇到编译错误。

据我所知,当结构包含简单的数据类型(例如int,float等)时,初始化结构的向量很容易,但是如果我内部有几个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。

2 个答案:

答案 0 :(得分:3)

使用std::string代替c样式的以null终止的数组。 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_B{1, 2, "1010101111", "ABC"},
    TEST_TYPE_B{4, 5, "1010101111", "ABC"},
    TEST_TYPE_B{7, 8, "1010101111", "ABC"},
    TEST_TYPE_B{0, 1, "1010101111", "ABC"},
    TEST_TYPE_B{3, 4, "1010101111", "ABC"}
};

答案 1 :(得分:0)

您的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'}}
}; 

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