模板类构造函数问题 - 为多维数组设计容器

时间:2011-01-13 12:41:04

标签: c++ visual-c++ templates constructor multidimensional-array

我正在尝试为数值计算的任何维度的数组创建自己的容器。我想使用模板这样做,以便我可以重载下标运算符[],使其像普通数组和向量一样工作,例如访问条目,如[10] [10] [10]等。

在尝试创建容器以容纳多维数组时,我无法使构造函数工作。请帮忙!

#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 个答案:

答案 0 :(得分:2)

您的构造函数使用表达式new T[size],这需要T作为默认构造(如果T是类类型)。

您需要执行以下操作:使用展示位置operator new表达式分配原始内存(例如,使用T)并构建new个实例。或者,您可以给container一个默认构造函数。

答案 1 :(得分:0)

你缺少很多构造函数。您至少需要一个默认构造函数和一个复制构造函数,operator=

答案 2 :(得分:0)

  • 为容器提供一个默认构造函数,它不带参数。看起来你想让你的容器不可调整大小。
  • 您可以将容器的维度设为模板参数,并忽略T initVal
  • 如果你这样做,你可能甚至不需要使用新的[]和删除[],但如果你这样做,你需要完整的“3规则”复制和分配才能正确实施。
  • 您可能会发现operator []的const重载也很有用。

答案 3 :(得分:0)

请参阅this

或查看boost::multi_array<>

你要做的事情:需要提前模板编程技能,因此审查助推器将是一个好的开始恕我直言。