我想知道如何初始化typename本身具有模板的模板类。我想要初始化的类如下:
typedef TVec<TPair <TInt, TLst<TInt>> > TMyType;
我只是使用默认构造函数(即空括号)实例化我的对象,并且想知道它是否还实例化了typename中的TPair和TLst类型? 例如,我可以简单地实例化如下吗?
TMyType myClass();
或者我应该如何实例化TMyType
对象?
下面我提供了库中的模板类及其默认构造函数的定义。
模板类及其默认构造函数的定义如下:
电视媒体
template <class TVal>
class TVec{
public:
typedef TVal* TIter;
protected:
int MxVals;
int Vals;
TVal* ValT;
public:
TVec(): MxVals(0), Vals(0), ValT(NULL){}
...
};
一对电视
template <class TVal1, class TVal2>
class TPair{
public:
TVal1 Val1;
TVal2 Val2;
public:
TPair(): Val1(), Val2(){}
...
};
列表
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){}
整数
class TInt{
public:
int Val;
public:
TInt(): Val(0){}
TInt(const int& _Val): Val(_Val){}
...
};
列表中的节点
template <class TVal>
class TLstNd{
public:
TLstNd* PrevNd;
TLstNd* NextNd;
TVal Val;
public:
TLstNd(): PrevNd(NULL), NextNd(NULL), Val(){}
...
};
答案 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 = 10
和Vals = 0
实例化对象obj,它运行正常。