如何在c ++中定义数组数组

时间:2018-05-22 14:43:49

标签: c++ arrays c++11 multidimensional-array

我有这个定义:

typedef uint8_t myType[16];

constexpr myType x0 = {1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6};
constexpr myType x1 = {11,12,13,14,15,16,17,18,19,10,11,12,13,14,15,16};
constexpr myType x2 = {21,22,23,24,25,26,27,28,29,20,21,22,23,24,25,26};

constexpr myType AllX[] = {x0,x1,x2};

在VS 2015中编译,给我这个错误:

An internal error has occurred in the compiler. 

知识分子报告此错误:

  

“const uint8_t *”类型的值不能用于初始化“const uint8_t”类型的实体

如何解决此问题?

2 个答案:

答案 0 :(得分:1)

您可以使用std::array来解决问题。

#include <array>

using myType = std::array<uint8_t, 16>;

int main()
{
   constexpr myType x0={1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6};
   constexpr myType x1={11,12,13,14,15,16,17,18,19,10,11,12,13,14,15,16};
   constexpr myType x2={21,22,23,24,25,26,27,28,29,20,21,22,23,24,25,26};

   constexpr std::array<myType, 3> AllX = {x0,x1,x2};
}

在评论中,你说,

  

但我不能将此方法用作x0x1x2和...已经在代码中以这种方式定义,我无法更改它。

在这种情况下,您唯一的选择是将这些对象的元素复制到AllX。您可以使用std::copy来简化该操作。唯一的问题是您无法使用constexpr AllX

   std::array<myType, 3> AllX = {};
   std::copy(begin(x0), end(x0), AllX[0].data());
   std::copy(begin(x1), end(x1), AllX[1].data());
   std::copy(begin(x2), end(x2), AllX[2].data());

答案 1 :(得分:0)

只能使用大括号括起初始化程序来初始化数组,而不能使用其他数组进行初始化。有关详细信息,请参阅aggregate initialization

修复:

constexpr myType AllX[] = {
    {1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6},
    {11,12,13,14,15,16,17,18,19,10,11,12,13,14,15,16},
    {21,22,23,24,25,26,27,28,29,20,21,22,23,24,25,26}
};

constexpr auto& x0=AllX[0];
constexpr auto& x1=AllX[1];
constexpr auto& x2=AllX[2];