错误:非法的零大小数组
error: Illegal zero sized array
我得到这个错误:
error C2229: class 'GenerateRandNum<int [],int>' has an illegal zero-sized array
在我的主体中,我调用我的随机生成器函数来输入到一个空的数据集
我把我主要的方法称为:
//declare small array
const int smallSize = 20;
int smallArray[smallSize];
// call helper function to put random data in small array
GenerateRandNum <int[], int> genData(smallArray, smallSize);
genData.generate();
头文件
template <class T, class B>
class GenerateRandNum
{
public:
T data;
B size;
GenerateRandNum(T list, B length)
{
data = list;
size = length;
}
void generate();
};
具有方法定义的文件
template<class T, class B>
void GenerateRandNum<T, B> ::generate()
{
for (B i = 0; i < size; i++)
{
data[0] = 1 + rand() % size;
}
}
指针和数组在C/C++中是不同的。它们是两种截然不同的东西。但是,数组衰减为指针。在函数声明中最引人注目的是:声明
void foo(int array[7]);
被定义为等同于
void foo(int* array);
也就是说,GenerateRandNum
构造函数得到的都是int*
,因为T = int []
在函数声明上下文中就是这样衰减的。然而,GenerateRandNum
的data
成员的类型是int []
(此处没有衰减),编译器假设它是一个零大小的数组。因此,当您试图将指针分配给数组时,编译器会抱怨。
你有两个选项来解决这个问题:
按照马可A.的建议,您可以使用
std::vector<>
。您将
GenerateRandNum
类声明为:template <class T> class GenerateRandNum { public: T* data; size_t size; GenerateRandNum(T* list, size_t length) { data = list; size = length; } void generate(); };
注意:
我已经删除了大小类型的模板参数:size_t
保证适用于计算内存中的任何内容,因此使用任何不同的内容都毫无意义。模板化此参数只会混淆代码。
您的方法存在一些问题:
-
第一个数组模板参数不能像n.m那样从参数中推导出其维度。注意到,您需要明确指定它:
GenerateRandNum<int[20], int>
-
做没有意义
data = list
因为在您的代码示例中,这是两个数组,您不能直接分配它们。你可以复制内存或专门化你的例程/模板
-
你真的应该考虑使用整数向量,例如
template <class T, class B> class GenerateRandNum { public: T data; B size; GenerateRandNum(T list, B length) { data = list; size = length; } void generate(); }; template<class T, class B> void GenerateRandNum<T, B> ::generate() { srand((unsigned int)time(NULL)); // You should initialize with a seed for (B i = 0; i < size; i++) { data[i] = 1 + rand() % size; // I believe you wanted data[i] and not data[0] } } int main(){ //declare small array const int smallSize = 20; std::vector<int> smallArray(smallSize); // call helper function to put random data in small array GenerateRandNum <std::vector<int>, int> genData(smallArray, smallSize); genData.generate(); }
示例
我修复了上面代码中的两个问题,请查看注释。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 声明后,gcc 的动态大小数组是否与标准数组有效相同?
- 将 int 数组转换为带有小数C++的双精度数组
- 如何将大括号初始值设定项用于动态大小数组和新数组?
- 对未知大小数组的引用的列表初始化:它是否应该推断数组大小?
- 返回指向固定大小数组C++的数组的指针
- 如何将小数数组转换为二进制数数组
- 对指向固定大小数组的指针数组的内存分配的解释
- 在 C++ 中创建固定大小的 int 数组的动态大小数组