2014-10-18 4 views
1

я получаю эту ошибку:ошибки: Illegal нулевого размера массив

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

} 
+1

Типы параметров шаблона 'genData' не будут выводиться из аргументов конструктора, вам необходимо передать их явно:' GenerateRandNum '. –

+1

Кроме того, вы не можете сделать это 'data = list', потому что массивы не могут быть назначены. –

ответ

1

Есть некоторые проблемы с вашим подходом:

  • Первый параметр шаблона массив не может иметь размерность вытекает из аргумента как н.м. отметил, что вам нужно будет указать его в явном виде:

    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

Указатели и массивы на C/C++ не совпадают. Это две разные вещи. Тем не менее, массивы распад в указатели. В частности, в объявлении функции: Декларация

void foo(int array[7]); 

определяется эквивалентным

void foo(int* array); 

Это сказало, все GenerateRandNum конструктор получает, является int*, потому что это то, что T = int [] затухает в объявлении функции контекст. Член data от GenerateRandNum, однако, имеет тип int [] (здесь нет распада), который ваш компилятор предполагает, что он является массивом нулевого размера. Следовательно, когда вы пытаетесь назначить указатель на массив, ваш компилятор жалуется.

У вас есть два варианта, чтобы исправить это:

  1. Вы используете 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 гарантированно быть пригодным для подсчета ничего в памяти, так нет абсолютно никакого смысла в использовании чего-либо другого. Templating этот параметр только запутывает ваш код.

Смежные вопросы