struct中的数组初始化器太多了

时间:2017-04-03 19:00:04

标签: c++ c++11

我有:

struct X {
    int i, j;
};

struct XArray {
    X xs[3];
};

X xs1[3] { {1, 2}, {3, 4}, {5, 6} };
XArray xs2 { {1, 2}, {3, 4}, {5, 6} };

xs1初始化正常,初始化xs2会产生编译错误:

error: too many initializers for 'XArray'
 XArray xs2 { {1, 2}, {3, 4}, {5, 6} };
                                     ^

有什么问题?为什么我不能初始化?

4 个答案:

答案 0 :(得分:5)

你需要另一层次的大括号:

XArray xs2            { { {1, 2}, {3, 4}, {5, 6} } };
//                    ^ ^ ^
//                    | | |
// For XArray structure | |
//                      | |
//           For xs array |
//                        |
//      For the X structure

答案 1 :(得分:3)

编译ŕ假定 xs 是一个字段,只有在添加另一个括号时才会解析数组:

XArray xs2 { {{1, 2}, {3, 4}, {5, 6}} };

何时添加其他元素,例如

struct YArray {
    X a; 
    X xs[3];
 }

然后很明显a和xs都需要加入括号:

YArray y{ 
            {1,2}, // a 
            { {1, 2}, {3, 4}, {5, 6} } // xs 
        };

答案 2 :(得分:2)

X xs[3] = { {1,2}, {3,4}, {5,6}};

然后将整个部分插入代码右侧:

XArray x2 = { { {1,2}, ... {5,6} }};

这是因为XArray只有一个成员,它需要一对括号括起来的支持:

XArray t = { /* value */ };

value碰巧是一个数组,也需要括号:

X xs[3] = { /* value2 */ };

由于此数组包含三个值,因此每个值都必须使用一对数字进行初始化。

答案 3 :(得分:1)

你必须使用:

XArray xs2 { { {1, 2}, {3, 4}, {5, 6} } };

这样XArray的第一个元素初始化为:{ {1, 2}, {3, 4}, {5, 6} }

在线here