【发布时间】:2017-02-06 21:54:37
【问题描述】:
我想用对象列表初始化向量或数组。它适用于向量,但不适用于数组:
struct Widget
{
string name;
vector<int> list;
};
struct Object
{
string name;
vector<int> list;
Object(string _name, vector<int> _list) : name(_name), list(_list) { }
};
int main()
{
const vector<Widget> vw = {
{"vw1", {1,2,3}},
{"vw2", {1,2,3}} };
const array<Widget,2> aw = {
{"aw1", {1,2,3}},
{"aw2", {1,2,3}} };
const vector<Object> vo = {
{"vo1", {1,2,3}},
{"vo2", {1,2,3}} };
const array<Object,2> ao = {
{"ao1", {1,2,3}},
{"ao2", {1,2,3}} };
return 0;
}
来自clang的错误:
widget.cpp:36:9: error: excess elements in struct initializer
{"aw2", {1,2,3}} };
^~~~~~~~~~~~~~~~
widget.cpp:41:10: error: no viable conversion from 'const char [4]' to 'Object'
{"ao1", {1,2,3}},
^~~~~
widget.cpp:41:17: error: no matching constructor for initialization of 'Object'
{"ao1", {1,2,3}},
^~~~~~~
向量和数组有什么区别,导致数组类型不支持这种语法?
【问题讨论】:
-
我不是 100% 确定,但我相信这是聚合初始化和大括号括起来的初始化列表之间的奇怪交互。可以按照以下答案中的说明解决,但我不确定问题的具体原因是什么。更仔细地检查错误消息表明该数组正在“吸收”一个额外的大括号,无论如何,因为缺少更好的术语;注意它认为
"ao1和{1,2,3}是两个不同的Objects,而不是同一个Object的初始化列表的一部分。