错误:非法的零大小数组

error: Illegal zero sized array

本文关键字:小数 数组 非法 错误      更新时间:2023-10-16

我得到这个错误:

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 []在函数声明上下文中就是这样衰减的。然而,GenerateRandNumdata成员的类型是int [](此处没有衰减),编译器假设它是一个零大小的数组。因此,当您试图将指针分配给数组时,编译器会抱怨。

你有两个选项来解决这个问题:

  1. 按照马可A.的建议,您可以使用std::vector<>

  2. 您将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();
    }
    

    示例

我修复了上面代码中的两个问题,请查看注释。