围绕标量初始值设定项错误的大括号

braces around scalar initializer error

我有这两个结构

struct vino_t {
    int tip;
    char *sorta;
    int godina;
    int cena;
};

struct vinarija_t {
    char *ime_vinarija;
    char lokacija[50];
    int kolku_vina;
    vino_t *lista_vina;
    int zarabotka;
    int nagradi;
}

我想初始化一个包含三个类型 vinarija_t 元素的数组(第二个结构)。

我有这样的清单

vinarija_t lista_vinar[3] = {
            {"Bovin", "Negotino", 3, {{1, "zhilavka", 2015, 850},{1, "rkaciteli", 2017, 700},{2, "kratoshija", 2009, 900}},2450,4},
            {"Tikvesh", "Kavadarci", 3,{{2, "vranec", 2016, 750},{1, "smedervka", 2007, 1000},{3, "zinfandel", 2014, 850}},2600,3},
            {"Dalvina", "Bosilovo", 3,{{2, "barbera", 2002, 1200},{3, "merlo", 2017, 850},{3, "malbek", 2016, 700}},2750,5} };

而且我经常收到错误:vino_t* 类型的标量初始值设定项用大括号括起来。我尝试更换牙套、添加牙套、移除牙套,但不知何故无法解决我的问题。

vinarija_t中,lista_vina是一个vino_t *。因为它是一个指针,所以它只能用一个值初始化(一个指针保存一个地址)。如果你想要一个数组,那么你需要将 lista_vina 更改为 vino_t lista_vina[3];.

话虽如此,您可能不希望这样。如果你想要一个可以是任意大小的数组,那么你真正想要的是 std::vector<vino_t>std::vector 可以从 初始化列表 构造,它还为您管理内存。


另请注意,所有 char* 的字符串文字都是非法的。字符串文字的类型为 const char[N],因此不能存储在 char* 中。您真的应该考虑改用 std::string 。做出所有这些改变会给你

struct vino_t {
    int tip;
    std::string sorta;
    int godina;
    int cena;
};

struct vinarija_t {
    std::string ime_vinarija;
    std::string lokacija;
    int kolku_vina;
    std::vector<vino_t> lista_vina;
    int zarabotka;
    int nagradi;
};

这还有一个额外的好处,即您的 类 现在完全可以移动和复制构造,而无需编写一行代码。