C++11 如何将具有var长度的编译时数组传递给构造函数?

C++11 如何将具有var长度的编译时数组传递给构造函数?,c++11,visual-c++,C++11,Visual C++,我有以下代码: struct MyArrayEntry { int type; int id; }; template<size_t arraySize> struct MyArray { template<typename T, typename... Types> MyArray(T t, Types... ts) : data{ { t, ts... } } {} int dataSize = arraySize;

我有以下代码:

struct MyArrayEntry
{
    int type;
    int id;
};

template<size_t arraySize>
struct MyArray
{
    template<typename T, typename... Types>
    MyArray(T t, Types... ts) : data{ { t, ts... } } {}
    int dataSize = arraySize;
    MyArrayEntry data[arraySize];
};


void Blah()
{
 static MyArray<3> kTest
            (
                { 1, 4 },
                { 2, 5 },
                { 3, 6 }
            );
}
struct MyArrayEntry
{
int型;
int-id;
};
模板
结构MyArray
{
模板
MyArray(T,类型…ts):数据{{T,ts..}{}
int dataSize=arraySize;
MyArrayEntry数据[阵列化];
};
废话
{
静态myktest数组
(
{ 1, 4 },
{ 2, 5 },
{ 3, 6 }
);
}
但这无法通过以下方式实现:

错误C2661:“MyArray::MyArray”:没有重载函数接受3 论据


我在这里做错了什么?

根据您提供的信息,我建议使用a和a电话:

模板
结构MyArray
{
const int dataSize=arraySize;//也可以将其设置为常量
MyArrayEntry数据[阵列化];
MyArray(std::initializer\u列表元素)
{
std::copy(开始(元素)、结束(元素)、std::开始(数据));
}
};
创建为

MyArray<3> kTest({ { 1, 4 }, { 2, 5 }, { 3, 6 } });
MyArray-kTest({{1,4},{2,5},{3,6});

当然,这是一对额外的花括号,但它会使您的代码更简单。

根据您提供的信息,我建议使用和调用:

模板
结构MyArray
{
const int dataSize=arraySize;//也可以将其设置为常量
MyArrayEntry数据[阵列化];
MyArray(std::initializer\u列表元素)
{
std::copy(开始(元素)、结束(元素)、std::开始(数据));
}
};
创建为

MyArray<3> kTest({ { 1, 4 }, { 2, 5 }, { 3, 6 } });
MyArray-kTest({{1,4},{2,5},{3,6});

当然,这是一对额外的花括号,但它会使您的代码更简单。

为什么不使用MyArrayEntry?或者为什么不是一个或甚至?那么你的类就更简单了。我不想要向量,因为我想避免动态分配。至于数组,因为我有一个字段int dataSize=arraySize;如果你把数组大小作为模板参数,为什么还要把它作为成员变量呢?无论何时使用元素的数量,您都可以直接使用
arraySize
。或者在阵列上使用
sizeof
运算符。或者,如果您使用
std::array
,那么它也可以使用
size()
成员函数。如果我们知道这个结构应该解决什么真正的问题,也许我们可以帮助您找到更好的解决方案?编译器不知道如何处理
{1,4}
。它可能是为了初始化某种类型的对象,但它是什么类型的?它是为了与第三方C库进行互操作,我无法更改。因此,内存布局的大小必须为32位。然后是后面的32/32位对元素。为什么不使用MyArrayEntry?或者为什么不是一个或甚至?那么你的类就更简单了。我不想要向量,因为我想避免动态分配。至于数组,因为我有一个字段int dataSize=arraySize;如果你把数组大小作为模板参数,为什么还要把它作为成员变量呢?无论何时使用元素的数量,您都可以直接使用
arraySize
。或者在阵列上使用
sizeof
运算符。或者,如果您使用
std::array
,那么它也可以使用
size()
成员函数。如果我们知道这个结构应该解决什么真正的问题,也许我们可以帮助您找到更好的解决方案?编译器不知道如何处理
{1,4}
。它可能是为了初始化某种类型的对象,但它是什么类型的?它是为了与第三方C库进行互操作,我无法更改。因此,内存布局的大小必须为32位。然后是后面的32/32位对元素。我一开始确实尝试了初始值设定项\u list-我没有意识到你必须复制数据,尽管这很糟糕。我试图把初始化列表直接传递到数据中,我一开始确实尝试了初始化列表,但我没有意识到你必须复制数据,尽管这很糟糕。我试图将初始值设定项列表直接传递到数据中