C++ 如何在使用模板时初始化数组

C++ 如何在使用模板时初始化数组,c++,arrays,templates,C++,Arrays,Templates,我创建了一个数组模板供个人使用 template <typename T, int size> struct Vector { T data[size]; }; 模板 结构向量{ T数据[大小]; }; 我试图初始化数据,如下所示: Vector<unsigned char, 10> test; test.data[] = {0,1,2,3,4,5,6,7,8,9}; 向量测试; 测试数据[]={0,1,2,3,4,5,6,7,8,9}; 我的编译器最后抱

我创建了一个数组模板供个人使用

template <typename T, int size>
struct Vector {
    T data[size];
};
模板
结构向量{
T数据[大小];
};
我试图初始化数据,如下所示:

Vector<unsigned char, 10> test;
test.data[] = {0,1,2,3,4,5,6,7,8,9};
向量测试;
测试数据[]={0,1,2,3,4,5,6,7,8,9};
我的编译器最后抱怨了一些关于“预期表达式”的问题。有人知道我在做什么吗?我希望能够使用这种类型的初始化,即一次给它整个数组定义,而不是使用for循环单独初始化元素。

只能在定义数组的点处初始化数组:

向量测试;
这就是你的数组,你已经定义好了,初始化它的机会已经过去了

编辑:看到Mat的答案,给我的备忘录:我要阅读C++11,很快…:-/

编辑2:我刚刚给出了错误的信息。Kerrek SB拥有如何正确操作的信息。;-)

只能在定义数组时初始化数组:

向量测试;
这就是你的数组,你已经定义好了,初始化它的机会已经过去了

编辑:看到Mat的答案,给我的备忘录:我要阅读C++11,很快…:-/


编辑2:我刚刚给出了错误的信息。Kerrek SB拥有如何正确操作的信息。;-)

定义变量时,必须提供数组的类型和大小:

Vector<int, 10> test;
向量测试;

但是,不能像普通数组那样指定成员数组。必须分别指定每个元素:

for (int i = 0; i < 10; i++)
    test.data[i] = i;  // If instantiated with type "int"
for(int i=0;i<10;i++)
测试数据[i]=i;//如果使用类型“int”实例化

定义变量时,必须提供数组的类型和大小:

Vector<int, 10> test;
向量测试;

但是,不能像普通数组那样指定成员数组。必须分别指定每个元素:

for (int i = 0; i < 10; i++)
    test.data[i] = i;  // If instantiated with type "int"
for(int i=0;i<10;i++)
测试数据[i]=i;//如果使用类型“int”实例化

由于类是一个聚合,因此可以使用常用的大括号语法初始化它:

Vector<int, 3> x = { { 1, 2, 3 } };
向量x={{1,2,3};
同样的情况也适用于
std::array

,因为您的类是一个聚合,所以可以使用常用的大括号语法初始化它:

Vector<int, 3> x = { { 1, 2, 3 } };
向量x={{1,2,3};
同样的情况也适用于
std::array

在新标准C++11中,您可以使用
std::initializer\u list
获得所需的结果,请参见下面的示例

#include <iostream>
#include <algorithm>

template <typename T, int size>
struct Vector {
  T data[size];

  Vector<T, size> (std::initializer_list<T> _data) {
    std::copy (_data.begin (), _data.end (), data);
  }
  // ...

  Vector<T, size>& operator= (std::initializer_list<T> const& _data) {
    std::copy (_data.begin (), _data.end (), data);
    return *this;
  } 
};

int
main (int argc, char *argv[])
{
  Vector<int, 10> v ({1,2,3,4,5,6}); // std::initializer_list

  v = {9,8,7,6,5,4,3,2,1,0}; // operator=
}

在新标准C++11中,可以使用
std::initalizer\u list
获得所需的结果,请参见下面的示例

#include <iostream>
#include <algorithm>

template <typename T, int size>
struct Vector {
  T data[size];

  Vector<T, size> (std::initializer_list<T> _data) {
    std::copy (_data.begin (), _data.end (), data);
  }
  // ...

  Vector<T, size>& operator= (std::initializer_list<T> const& _data) {
    std::copy (_data.begin (), _data.end (), data);
    return *this;
  } 
};

int
main (int argc, char *argv[])
{
  Vector<int, 10> v ({1,2,3,4,5,6}); // std::initializer_list

  v = {9,8,7,6,5,4,3,2,1,0}; // operator=
}

我认为我错了,你是对的-语法只用于初始化…我认为我错了,你是对的-语法只用于初始化…除非你计划向该结构添加更多内容,否则我认为你最好使用普通的旧数组。除非你计划向该结构添加更多内容,我认为您最好使用普通的旧数组。“但是,您不能像普通数组一样分配给成员数组。”在C++11中不再是真的。“但是,您不能像普通数组一样分配给成员数组。”在C++11中不再是真的。您的第一个示例将无法编译。@jrok我发现代码段没有任何错误,想给我点启发吗?GCC在第一个代码段的最后一行说:“错误:从初始值设定项列表分配到数组”。@jrok啊,对。。我对从std::initializer_list到T[]的赋值有一个模糊的记忆,它被放入了c++11,但我想这只是一个c++0x gcc草案实现。代码段已更改。您的第一个示例将无法编译。@jrok我认为代码段没有问题,请告诉我好吗?GCC对第一个代码段的最后一行说:“错误:从初始值设定项列表分配到数组”。@jrok啊,对。。我对从std::initializer_list到T[]的赋值有一个模糊的记忆,它被放入了c++11,但我想这只是一个c++0x gcc草案实现。代码段已更改。