繁体   English   中英

全局声明二维数组(错误:初始值设定项太多)

[英]declaring 2d array globally (Error: too many initializer values)

我使用 stackoverflow 已经很长时间了,以前从未发布过问题,但是这个问题让我非常沮丧。

我有这段代码

array<array<string, 10>, 10> cShots = 
{
    { " ", " ", " ", " ", " ", " ", " ", " ", " ", " " },
    { " ", " ", " ", " ", " ", " ", " ", " ", " ", " " },
    { " ", " ", " ", " ", " ", " ", " ", " ", " ", " " },
    { " ", " ", " ", " ", " ", " ", " ", " ", " ", " " },
    { " ", " ", " ", " ", " ", " ", " ", " ", " ", " " },
    { " ", " ", " ", " ", " ", " ", " ", " ", " ", " " },
    { " ", " ", " ", " ", " ", " ", " ", " ", " ", " " },
    { " ", " ", " ", " ", " ", " ", " ", " ", " ", " " },
    { " ", " ", " ", " ", " ", " ", " ", " ", " ", " " },
    { " ", " ", " ", " ", " ", " ", " ", " ", " ", " " }
}; 

在全球范围内的任何方法之外。 我想要做的是创建一个 10 x 10 的二维数组,其中包含空格字符串。 相反,我在第三行的第一个括号上收到错误消息,说“初始值设定项太多”。 我找到的针对此错误的每个解决方案都表明我正在做的事情是正确的。 我尝试过多种其他方式。

string** cShots = 
{
    {" ", " ", " ", " ", " ", " ", " ", " ", " ", " "},
    {" ", " ", " ", " ", " ", " ", " ", " ", " ", " "},
    {" ", " ", " ", " ", " ", " ", " ", " ", " ", " "},
    {" ", " ", " ", " ", " ", " ", " ", " ", " ", " "},
    {" ", " ", " ", " ", " ", " ", " ", " ", " ", " "},
    {" ", " ", " ", " ", " ", " ", " ", " ", " ", " "},
    {" ", " ", " ", " ", " ", " ", " ", " ", " ", " "},
    {" ", " ", " ", " ", " ", " ", " ", " ", " ", " "},
    {" ", " ", " ", " ", " ", " ", " ", " ", " ", " "},
    {" ", " ", " ", " ", " ", " ", " ", " ", " ", " "}
}; 

string cShots[10][10] = 
{
    {" ", " ", " ", " ", " ", " ", " ", " ", " ", " "},
    {" ", " ", " ", " ", " ", " ", " ", " ", " ", " "},
    {" ", " ", " ", " ", " ", " ", " ", " ", " ", " "},
    {" ", " ", " ", " ", " ", " ", " ", " ", " ", " "},
    {" ", " ", " ", " ", " ", " ", " ", " ", " ", " "},
    {" ", " ", " ", " ", " ", " ", " ", " ", " ", " "},
    {" ", " ", " ", " ", " ", " ", " ", " ", " ", " "},
    {" ", " ", " ", " ", " ", " ", " ", " ", " ", " "},
    {" ", " ", " ", " ", " ", " ", " ", " ", " ", " "},
    {" ", " ", " ", " ", " ", " ", " ", " ", " ", " "}
}; 

但我尝试的每件事都有相同的结果。

请帮忙!

编辑:嗯......我发现我只需要更多的括号......错误就消失了......但是现在当我运行我的代码visual studio时说它是一个成功的构建,但随后永远冻结......

当您看到此处的语法有一个特殊情况时,事情就更容易理解了。 std::array是一个聚合,它是一个包含单个数据成员的结构,它是底层原始数组。 要初始化其中一个,您需要统一初始化数组(第一个大括号),然后初始化存储在std::array的底层原始数组成员(第二个大括号);

所以当你有这样的事情时:

array<string, 3> test = {{"a", "b", "c"}};

最外面的大括号初始化array本身,然后内部部分初始化底层数组。 在这种情况下,很明显这是它的工作方式,并且做了一个特殊情况(参见标准:第 8.5 节了解更多信息),允许编译器接受以下其他语法:

array<string, 3> test = {"a", "b", "c"} ;

但是,在问题的情况下,它不是标准中指定的特殊形式,因此您需要额外的大括号(这也让我第一次遇到它时感到困惑)。 实际上有一个关于这个的缺陷报告http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2012/n3367.html#1270

在最近的 C++ 标准中(参见Can we omit the double-braces for std::array in C++14? ),这个要求被放宽了。

因为问题中的代码对语法的特殊情况没有好处,所以我们需要两个大括号。 在这种情况下,您的初始化程序的长度不是一:

array<array<string, 10>, 10> cShots = 
{
    { " ", " ", " ", " ", " ", " ", " ", " ", " ", " " },
    { " ", " ", " ", " ", " ", " ", " ", " ", " ", " " }, //extra initializer elements but only one underlying raw array
    //snip
    { " ", " ", " ", " ", " ", " ", " ", " ", " ", " " }
}; 

对于编译器来说,您似乎正在尝试初始化std::array类的多个成员,但问题是只有一个底层存储数组。 因此,您会在此处获得编译器错误消息。 要使其工作,您需要更加明确并添加额外的一对大括号以获取传递给外部std::array的长度为 1 的初始值设定项。 然后初始化包含其他数组的底层原始数组:

array<array<string, 10>, 10> cShots = 
{{
    { " ", " ", " ", " ", " ", " ", " ", " ", " ", " " },
    { " ", " ", " ", " ", " ", " ", " ", " ", " ", " " },
    //snip
    { " ", " ", " ", " ", " ", " ", " ", " ", " ", " " }
}}; 

有关概念证明,请参阅: http : //coliru.stacked-crooked.com/a/4c57a7193629931f (注意这里的嵌套数组确实受益于语法特殊情况)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM