我创建了一个供我个人使用的数组模板。
template <typename T, int size>
struct Vector {
T data[size];
};
我试图像这样初始化数据:
Vector<unsigned char, 10> test;
test.data[] = {0,1,2,3,4,5,6,7,8,9};
我的编译器最终抱怨“预期表达”。有谁知道我在做什么?我希望能够使用这种初始化方式,您可以立即为其提供整个数组定义,而不是使用for循环来单独初始化元素。
答案 0 :(得分:3)
由于您的类是聚合,因此可以使用通常的大括号语法对其进行初始化:
Vector<int, 3> x = { { 1, 2, 3 } };
完全相同的事情适用于std::array<int, 3>
。
答案 1 :(得分:2)
在新标准C ++ 11中,您可以使用std::initalizer_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::vector
时可用的功能。
#include <iostream>
#include <algorithm>
template <typename T, int size>
struct Vector {
T _data[size];
Vector (T* begin, T* end) {
std::copy (begin, end, _data);
}
// ...
void assign (T* begin, T* end) {
std::copy (begin, end, _data);
}
};
int
main (int argc, char *argv[])
{
int A1[4] = {1,2,3,4};
int A2[5] = {99,88,77,66,55};
Vector<int, 10> v1 (A1, A1+4);
// ...
v1.assign (A2, A2+5);
}
答案 2 :(得分:0)
您只能在定义的位置初始化数组:
Vector<unsigned char, 10> test;
有你的数组,你完成了它的定义,你初始化它的机会已经过去了。
编辑:看到Mat的回答,给我回复:我有来阅读C ++ 11,很快......: - /
编辑2:我刚刚提供了有关错误的信息。 Kerrek SB提供了有关如何正确操作的信息。 ; - )
答案 3 :(得分:0)
定义变量时必须提供数组的类型和大小:
Vector<int, 10> test;
但是,您无法像普通数组一样分配给成员数组。您必须分别分配每个元素:
for (int i = 0; i < 10; i++)
test.data[i] = i; // If instantiated with type "int"