不能在两个重叠的结构上使用初始化列表
Cannot use initialization list on two overlapping structs
我想使用初始化列表来初始化变量 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
如果你初始化你的 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 } };
因此您不需要额外的括号。
您还可以为 para_t
添加接受 std::initializer_list<word_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 } };
}
我想使用初始化列表来初始化变量 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
如果你初始化你的 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 } };
因此您不需要额外的括号。
您还可以为 para_t
添加接受 std::initializer_list<word_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 } };
}