无法对两个重叠的结构使用初始化列表



我想使用初始化列表来初始化变量p1,以简化操作。但这还没有实现,请帮忙。代码几乎是自我解释的。

struct word_t {
int in;
string word;
int out;
word_t(int i, string w, int o): in(i),word(w),out(o) {}
};

struct para_t {
std::vector<word_t> words;
};
struct song_t { 
std::vector<para_t> paras;
};    
int main()
{
//SONG
std::vector<song_t> song;
para_t p1{ { 0, "We", 10 }, { 11, "are", 14 } , { 15, "the", 18 } 
, { 19, "World", 22 } }; // CANNOT INITIALIZE LIKE SO 
p1.words.push_back(word_t(0, "World", 10));   // THIS WORKS

}

您还需要一个{},即

para_t p1{ { { 0, "We", 10 }, { 11, "are", 14 } , { 15, "the", 18 } , { 19, "World", 22 } } };
//       ^                                                                                  ^ <- for para_t
//         ^                                                                              ^   <- for para_t::words
//           ^             ^                                                                  <- for elements (i.e. word_t) in vector

您还可以为接受std::initializer_list<word_t>para_t添加构造函数。

#include <vector>
#include <string>
#include <initializer_list>
struct word_t {
int in;
std::string word;
int out;
word_t(int i, std::string w, int o): in(i),word(w),out(o) {}
};

struct para_t {
std::vector<word_t> words;
para_t(std::initializer_list<word_t> v) : words{v} {}
};
struct song_t { 
std::vector<para_t> paras;
};    
int main()
{
para_t p1{ { 0, "We", 10 }, { 11, "are", 14 } , { 15, "the", 18 }, { 19, "World", 22 } };
}

如果初始化word_t的矢量,它将是这样的:

std::vector<word_t> song{ { 0, "We", 10 }, { 11, "are", 14 } , { 15, "the", 18 } 
, { 19, "World", 22 } };

但是由于您的std::vector<word_t> words;struct para_t中,因此您有一个额外的级别,因此您应该在初始值设定项列表周围使用额外的{ }

由于它是结构中唯一的成员,请考虑将其设为typedef:

typedef std::vector<word_t> para_t;
para_t song{ { 0, "We", 10 }, { 11, "are", 14 } , { 15, "the", 18 } 
, { 19, "World", 22 } };

所以你不需要额外的括号。

相关内容

  • 没有找到相关文章

最新更新