【问题标题】:Excess elements in struct initializer when nested std::array嵌套 std::array 时结构初始化程序中的多余元素
【发布时间】:2016-01-26 18:27:09
【问题描述】:

我在以下return 行收到Excess elements in struct initializer

using triangleColor = std::array<std::array<float, 4>, 3>;

triangleColor colorBlend(TriangleColorBlend c){
    switch (c) {
        case TriangleColorBlend::white:
            return {{1.0,1.0,1.0,1.0},{0.7,0.7,0.7,1.0},{0.5,0.5,0.5,1.0}};
            break;

        ... // other cases
    }
}

我希望花括号文字能够以嵌套方式工作,因为如果我只使用一个 std::array 而不是嵌套的,它就可以正常工作。

以上是不可能的,为什么不呢?

注意,建议的副本并没有真正解决嵌套情况下 std::array 的奇怪行为。

【问题讨论】:

  • 请将有关此问题的适当性的任何讨论提交给the meta question,但 OP 是正确的:询问如何做某事的问题不一定需要 MCVE 才能保持打开状态。我会在meta中说更多。 Shog9talked about this in this meta post.
  • @GeorgeStocker 现已撤回。你是对的,我之前一直在争论这个问题,但事实证明是错误的。

标签: c++ c++11


【解决方案1】:
triangleColor colorBlend(TriangleColorBlend c) {
    switch (c) {
    case TriangleColorBlend::white:
        return {{
            {{ 1.0f, 1.0f, 1.0f, 1.0f }},
            {{ 0.7f, 0.7f, 0.7f, 1.0f }},
            {{ 0.5f, 0.5f, 0.5f, 1.0f }}
        }};
    default:
        throw std::invalid_argument("c");
    }
}

Online Demo

您的代码有两个问题:

  1. 内部数组缺少大括号。
  2. 正如@Praetorian 所述,colorBlend 在默认情况下没有返回值。

【讨论】:

  • 这似乎是一种解决方法。重要的问题是为什么 OP 的代码不起作用?
  • @RSahu :这不是解决方法,而是更正后的代码。
  • 这确实解决了问题,非常感谢。我错过了额外的大括号。我认为在 C++14 中它们不再是必需的,但我可能误解了那个细节。谢谢!
  • @johnbakers :在这种情况下,内部数组 (demo) 可以省略它们,但外部数组两者都需要。
  • @ildjarn,在我看来这是一种解决方法,因为没有说明 OP 的代码不起作用。我现在明白为什么它不能解决了。
【解决方案2】:

您缺少一组括号。

return {{1.0,1.0,1.0,1.0},{0.7,0.7,0.7,1.0},{0.5,0.5,0.5,1.0}};

应该是

return {{{1.0,1.0,1.0,1.0},{0.7,0.7,0.7,1.0},{0.5,0.5,0.5,1.0}}};

您可以在minimal example 中看到它的工作原理

【讨论】:

    【解决方案3】:

    另一种解决方法:

    triangleColor colorBlend(TriangleColorBlend c){
       using t1 = std::array<float, 4>;
       switch (c) {
          case TriangleColorBlend::white:
             return {t1{1.0,1.0,1.0,1.0},t1{0.7,0.7,0.7,1.0},t1{0.5,0.5,0.5,1.0}};
             break;
    
          default:
             break;
       }
       return triangleColor{};
    }
    

    为什么这个问题的答案

            return {{1.0,1.0,1.0,1.0},{0.7,0.7,0.7,1.0},{0.5,0.5,0.5,1.0}};
    

    不工作可以在https://stackoverflow.com/a/8192275/434551找到:

    std::array是C++11规则的聚合,因此可以通过聚合初始化来创建。要聚合初始化结构内的数组,您需要第二组花括号。

    【讨论】:

      猜你喜欢
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多