0

我試圖爲數值計算的任何維數組創建我自己的容器。我想用模板做這件事,這樣我就可以重載下標操作符[],以便它像正常的數組和向量一樣工作,例如訪問條目,如[10] [10] [10]等。模板類的構造函數問題 - 爲multidim數組設計一個容器

我在嘗試創建容器來容納多維數組時遇到了構造函數無法工作的問題。請幫忙!

#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或升壓庫,但我想了解如何創建自己的。效率很重要。謝謝!

回答

2

您的構造函數使用表達式new T[size],這需要T爲默認可構造的(如果T是類類型)。

你需要做的是這樣的:分配(例如使用operator new),構建T實例「到位」使用放置new表達原始內存。或者,你可以給container一個默認的構造函數。

+0

謝謝!我添加了一個默認的構造函數,這些行和它的工作。 void * raw = :: operator new(size * sizeof(T)); data = new(raw)T [size]; – Jack 2011-01-13 14:46:52

+0

@傑克:我的意思是一個或另一個。 `void * raw = :: operator new(size * sizeof(T))沒有優勢; data = new(raw)T [size];`over`data = new T [size];`,如果你還在做`delete [] data`,如果你使用前者,這是不正確的。 – 2011-01-13 14:51:18

0

您錯過了很多構造函數。您至少需要一個默認的構造函數和一個拷貝構造函數operator=

0
  • 給容器一個默認的構造函數,不帶任何參數。看起來你想讓你的容器不可調整大小。
  • 你可以做容器的尺寸模板參數和忽略的T initVal
  • 如果你這樣做,你可能甚至不需要使用新的[]和delete [],但如果你做,你需要完整的「 3的規則「的複製和分配得到正確實施。
  • 您可能會發現operator []的const重載也很有用。
0

看到this

或審查boost::multi_array<>

你正在嘗試做的事:需要提前模板編程技能,因此審查提升將是一個良好的開端恕我直言。