错误:非法零大小的数组

时间:2014-10-18 05:16:50

标签: c++ templates

我收到此错误:

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;
    }

}

2 个答案:

答案 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();
    }
    

    Example

我在上面的代码中修复了两个问题,看看评论。

答案 1 :(得分:1)

指针和数组在C / C ++中并不相同。它们是两个非常不同的东西。但是,数组衰减为指针。最值得注意的是在函数声明中:声明

void foo(int array[7]);

定义为等同于

void foo(int* array);

也就是说,所有GenerateRandNum构造函数都是int*,因为T = int []在函数声明上下文中衰减了。但是,data的{​​{1}}成员的类型为GenerateRandNum(此处没有衰减),您的编译器假定它是零大小的数组。因此,当您尝试为数组指定指针时,编译器会抱怨。

您有两种方法可以解决此问题:

  1. 您使用int []代替,正如Marco A.建议的那样。

  2. 您将std::vector<>课程声明为:

    GenerateRandNum
  3. 注意:
    我删除了大小类型的模板参数:template <class T> class GenerateRandNum { public: T* data; size_t size; GenerateRandNum(T* list, size_t length) { data = list; size = length; } void generate(); }; 保证适合计算内存中的任何内容,因此使用任何不同的东西绝对没有意义。模板化此参数只会模糊您的代码。