(C++)实例化和具体化以及它们的声明方式——简单总结和举例说明

在代码中包含函数模板本身并不会生成函数定义,它只是一个用于函数定义的方案。 模板类或模板函数并不是真正的类或函数,它们是编译器指令,说明如何生成类或函数,模板的具体实现可以分为实例化和具体化。

编译器使用模板为特定类型生成函数定义时,得到的是模板实例。

1、实例化:实例化有两种形式,分别为显式实例化和隐式实例化。模板并非函数定义,实例式函数定义。

模板例子:
template
void Swap(T &a, T &b)

(1)显示实例化:直接命令编译器创建特定的实例。

声明方式:
(a)直接在程序中使用函数创建。
eg:Swap(a,b);
(b)声明所需要的种类——用<>符号指示类型,并在声明前加上关键字template。
eg:template void Swap(int, int);

(2)隐形实例化:函数调用导致编译器生成改该函数的实例。使用模板之前,编译器不生成模板的声明和定义示例,后面有程序用了,编译器才会根据模板生成一个实例函数。
eg:
函数调用Swap(i,j)导致编译器生成Swap()的一个实例,该实例使用int类型。模板并非函数定义,但使用int的模板实例是函数定义。因为编译器之所以知道需要进行定义,是由于程序调用Swap()函数时提供了int参数。

2、具体化:当模板使用某种类型类型实例化后生成的类或函数不能满足需要时,可以考虑对模板进行具体化。具体化时可以修改原模板的定义,当使用该类型时,按照具体化后的定义实现。具体化相当于对某种类型进行特殊处理

简单说:隐式实例化、显示实例化和显示具体化统称具体化。
声明方式:
(a)template <> void Swap(int &, int &);
(b)template <> void Swap(int &, int &);

区别在于,这声明是不要使用Swap()模板来生成函数定义,而应使用专门为int类型显式地定义的函数定义。
这些原型必须有自己的函数定义。显式具体化声明在关键字template后包含<>,而显式实例化没有。

注意:
1、试图在同一个文件(或转换单元)中使用同一种类型的显式实例和显式具体化将出错。
2、引入显式实例化后,必须使用新的语法——在声明中使用前缀template和template<>,以区分显式实例化和显式具体化。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部