类模版的实例化过程

vcgaoshou 2007-12-02 02:57:45
定义类模版后,再定义类模版的对象具体过程为
1。编译程序将类模版实例化成模版类,
2。在运行时实例化成对象。
比如
template<typename T,int n>class Array{
public:
Array();
~Array();
protected:
int size;
T* element;
};
template<typename T,int n>Array<T,n>::Array(){
if(n>1)size=n;
else size=1;
element=new T[size];
}
template<typename T,int n>Array<T,n>::~Array(){
delete [] element;
}
书上说编译器将定义语句Array<int ,5> intary;编译后,实际生成如下类
public:
Array();
~Array();
protected:
int size;
T* element;
};
我的问题是:n怎么不见了呢?运行时到哪儿去找n呢,也就是当类模版存在非类型参数时,到底如何编译的,编译器
如何处理非类型参数生成的,生成的模版类的形式是怎样的。
如果是生成如下形式
public:
Array(int n=5);
~Array();
protected:
int size;
T* element;
};
好像也有问题,这样岂不是定义对象要提供初值了,类模版中的构造函数并不需要初值啊
...全文
431 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ryfdizuo 2007-12-02
  • 打赏
  • 举报
回复
对于模板实参的演绎只能够用于函数模板或者成员函数模板,是不能够用于类模板的,另外
对于类模板的构造函数,也不能根据实参来演绎类模板实参。
template<typename T>
class C
{
public:
S(T b) : a(b)
{}
private:
T a;
};

S x(12);//错误,不能够从构造函数的调用实参12演绎类模板参数T;
建议lz看一下《C++template中文版》把基本概念搞一下。
ryfdizuo 2007-12-02
  • 打赏
  • 举报
回复
Array <int ,5> intary
是模板的特化吧;
template <typename T,int n> class Array
类Array类的模板参数是T啊, 所以在模板的实参演绎中指挥演绎T,
对于n来说类型已经确定了,n是非模板参数,编译的时候直接去替换n就行了,
vcgaoshou 2007-12-02
  • 打赏
  • 举报
回复
Array(T x):m_i(n),element(x) 中element(x) 是错误的,我的问题是编译成模版类后n怎么处理
tangshuiling 2007-12-02
  • 打赏
  • 举报
回复
楼主的例子不够明显,试举例如下:
template <class T,int n>
class Array
{
int m_i;
T element;
public:
Array(T x):m_i(n),element(x) {cout<<"ELEMENT VALUE:"<<element<<" m_i value:"<<m_i<<endl;}
};
int main()
{
Array<int,5> obj(6);
return 0;
}
此例中m_i被数值5实例化,T 被int实例化
xalangying 2007-12-02
  • 打赏
  • 举报
回复
n在代码里,如这里
if(n> 1)size=n;
else size=1;

如果你在代码没使用它,那它不存在于运行时,模板都在编译时的东西
模板每实例化一份,就生成一份不同的代码

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧