我收到此错误:
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;
}
}
答案 0 :(得分:1)
您的方法存在一些问题:
第一个数组模板参数的参数不能从参数推导为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();
}
我在上面的代码中修复了两个问题,看看评论。
答案 1 :(得分:1)
指针和数组在C / C ++中并不相同。它们是两个非常不同的东西。但是,数组将衰减为指针。最值得注意的是在函数声明中:声明
void foo(int array[7]);
定义为等同于
void foo(int* array);
也就是说,所有GenerateRandNum
构造函数都是int*
,因为T = int []
在函数声明上下文中衰减了。但是,data
的{{1}}成员的类型为GenerateRandNum
(此处没有衰减),您的编译器假定它是零大小的数组。因此,当您尝试为数组指定指针时,编译器会抱怨。
您有两种方法可以解决此问题:
您使用int []
代替,正如Marco 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();
};
保证适合计算内存中的任何内容,因此使用任何不同的东西绝对没有意义。模板化此参数只会模糊您的代码。