我有这个定义:
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”类型的实体
如何解决此问题?
答案 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};
}
在评论中,你说,
但我不能将此方法用作
x0
和x1
和x2
和...已经在代码中以这种方式定义,我无法更改它。
在这种情况下,您唯一的选择是将这些对象的元素复制到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];