Проблемы конструктора класса шаблона - проектирование контейнера для многомерных массивов - PullRequest
0 голосов
/ 13 января 2011

Я пытаюсь создать свой собственный контейнер для массива любого измерения для численных вычислений.Я хотел бы сделать это с помощью шаблонов, чтобы я мог перегрузить оператор индекса [], чтобы он работал как обычные массивы и векторы, например, для доступа к записям типа [10] [10] [10] и т. Д.

IЯ не могу заставить конструктор работать, когда пытаюсь создать контейнеры для хранения многомерных массивов.Пожалуйста, помогите!

#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>
using namespace std;

template <class T>
class container{
public:
 inline T& operator[](int i){return data[i];}
 container(int si, T initval){
  size=si; 
  data=new T[size]; 
  transform(data,data+size,data, [initval] (T d) {return initval;});
        // transform fills array with the initial value. 
 }
 ~container(){delete [] data;}
private:
 T* data;
 int size;
};

int main(){
 //For example:
 vector<vector<int>> v1(10,vector<int>(10,0)); //2D 10x10
 vector<vector<vector<int>>> v2(10,vector<vector<int>>(10,vector<int>(10,0))); 
    //3D 10x10x10

 container<int> c1(10,0); //1D 10x1 works!
 container<container<int>> c2(10,container<int>(10,0)); //2D 10x10 fails!

 system("pause");
 return 0;
}

Вывод ошибки VS10:

error C2512: 'container<T>' : no appropriate default constructor available

      with
      [
          T=int
      ]
      c:\users\jack\documents\visual studio 2010\projects\ref\ref\ref.cpp(11) : while compiling class template member function 'container<T>::container(int,T)'
      with
      [
          T=container<int>
      ]
      c:\users\jack\documents\visual studio 2010\projects\ref\ref\ref.cpp(28) : see reference to class template instantiation 'container<T>' being compiled
      with
      [
          T=container<int>
      ]

Build FAILED.

Я знаю, что могу просто использовать valarray или библиотеку boost, но я хотел бы понять, как создать свою собственную.Эффективность важна.Спасибо!

Ответы [ 4 ]

2 голосов
/ 13 января 2011

Ваш конструктор использует выражение new T[size], и для этого требуется T для построения по умолчанию (если T является типом класса).

Вам нужно сделать что-то вроде: выделить сырую память (напримериспользуя operator new) и создайте T экземпляров "на месте", используя выражение размещения new.В качестве альтернативы, вы можете просто дать container конструктор по умолчанию.

0 голосов
/ 13 января 2011

см. это

или обзор boost :: multi_array <>

То, что вы пытаетесь сделать: требует дополнительных навыков программирования шаблонов,поэтому просмотр буста будет хорошим началом ИМХО.

0 голосов
/ 13 января 2011
  • Дайте контейнеру конструктор по умолчанию, который не принимает параметров.Похоже, что вы хотите сделать свой контейнер неизменяемым, хотя.
  • Вы можете сделать измерение контейнера параметром шаблона и игнорировать T initVal
  • Если вы сделаете это, вы, вероятно, этого не сделаетедаже нужно использовать new [] и delete [], но если вам нужно, чтобы полное «правило 3» копирования и назначения было правильно реализовано.
  • Может оказаться полезной константная перегрузка оператора []тоже.
0 голосов
/ 13 января 2011

Вам не хватает многих конструкторов. Вам нужен конструктор по умолчанию и конструктор копирования как минимум, operator= тоже.

...