实例化一个模板类,其中typename本身是一个模板类

时间:2011-03-13 17:08:22

标签: c++

我想知道如何初始化typename本身具有模板的模板类。我想要初始化的类如下:

typedef TVec<TPair <TInt, TLst<TInt>> > TMyType;

我只是使用默认构造函数(即空括号)实例化我的对象,并且想知道它是否还实例化了typename中的TPair和TLst类型? 例如,我可以简单地实例化如下吗?

TMyType myClass(); 

或者我应该如何实例化TMyType对象?

下面我提供了库中的模板类及其默认构造函数的定义。

模板类及其默认构造函数的定义如下:

  1. 电视媒体

    template <class TVal> 
    class TVec{
    public:
       typedef TVal* TIter;
    protected:
      int MxVals; 
      int Vals;
      TVal* ValT;
    public:
      TVec(): MxVals(0), Vals(0), ValT(NULL){}
    ...
    };
    
  2. 一对电视

    template <class TVal1, class TVal2>
    class TPair{
    public:
      TVal1 Val1;
      TVal2 Val2;
    public:
      TPair(): Val1(), Val2(){}
    ...
    };
    
  3. 列表

    template <class TVal>
    class TLst{
    public:
      typedef TLstNd<TVal>* PLstNd;
    private:
      int Nds;
      PLstNd FirstNd;
      PLstNd LastNd;
    public:
      TLst(): Nds(0), FirstNd(NULL), LastNd(NULL){}
    
  4. 整数

    class TInt{
    public:
      int Val;
    public:
      TInt(): Val(0){}
      TInt(const int& _Val): Val(_Val){}
    ...
    };
    
  5. 列表中的节点

    template <class TVal>
    class TLstNd{
    public:
      TLstNd* PrevNd;
      TLstNd* NextNd;
      TVal Val;
    public:
      TLstNd(): PrevNd(NULL), NextNd(NULL), Val(){}
    ...
    };
    

3 个答案:

答案 0 :(得分:1)

TMyType myClass();不实例化任何对象,而是声明函数myClass的函数原型,它返回类型TMyType。您应该省略括号并使用TMyType myClass;

答案 1 :(得分:1)

您可以使用默认构造函数简单地实例化对象。但是,使用空的paranteses(TMyType myClass();)将不会这样做。这将被解析为函数声明(名为myClass的函数,它不接受任何参数并返回类型为TMyType的对象)。在尝试使用变量时,这很可能会导致编译器出错。要默认构造变量,您应该省略括号:

TMyType myClass;

这与默认构建TMyType类型的匿名对象不同,后者需要parantheses(因此您可以执行TMyType(),但不能TMyType myVar();)。

答案 2 :(得分:0)

我运行了以下代码:

typedef TVec<TPair<TInt,TLst<TInt>>> TMyType;
TMyType obj(10,0);
TInt val1;
TLst<TInt> val2; 
for (int i=0; i<10; i++)
{
    obj[i].GetVal(val1,val2);
    printf("%d %i\n",val1,val2.Len());
}

return 0;

输出如下:

  

0 0
  0 0
  0 0
  0 0
  0 0
  0 0
  0 0
  0 0
  0 0
  0 0

但是我用MxVals = 10Vals = 0实例化对象obj,它运行正常。