嵌套std :: array时struct initializer中的多余元素

时间:2016-01-26 18:27:09

标签: c++ c++11

我在以下Excess elements in struct initializer行中获得了return

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的奇怪行为。

3 个答案:

答案 0 :(得分:4)

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没有默认案例的返回值。

答案 1 :(得分: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

中看到它正常工作

答案 2 :(得分:2)

另一种解决方法:

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规则的聚合,因此可以通过聚合初始化来创建。要聚合初始化结构中的数组,需要第二组花括号。