博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
“模板”学习笔记(5)-----编译器在处理函数模板的时候都干了啥
阅读量:4564 次
发布时间:2019-06-08

本文共 1633 字,大约阅读时间需要 5 分钟。

=================编译器处理函数模板的方法:实例化模板函数====================

      C++的编译器在遇到一个函数模板的时候,它首先要做的是确定该函数的参数,这就叫做把一个函数模板修改成一个具有具体参数的函数。这种方法一般而言是隐式转换的,我们一般是看不见的,但是C++也提供了一种显示转换的方法,如下: 

template void Swap
(int &a,int &b);

      这就是实例化模板函数的声明,上面这个式子把Swap()函数实例化为一个接受整型变量的函数。它与具体化函数模板不同之处在于:

  • 具体化函数模板告诉了编译器利用此模板生成一个具体化了参数类型的重载函数,这样我们就可以通过该函数的定义来修改这个这个重载的函数,从而达到功能升级的目的。比如说在《》中,我们就在程序中重载了这个Swap()函数,使它能够在面对结构体people类型的变量时,只交换他们的年龄(age),而不交换他们的名字。
  • 实例化模板函数就不是这样。编译器根据其他已有模板的定义部分创建参数类型为一个准确类型的参数,这里实例化模板函数的作用只在于根据传递进来的具体参数创建一个具体的重载函数,而不会改变其定义的功能。比如说,Swap()模板函数接受的参数为ElementType &a和ElementType &b,而我们要传递两个整型变量x和y的时候,编译器就会自动将Swap()函数声明成这样:
    void Swap(int &x,int &y);

    这就表示编译器根据最初的函数模板Swap()生成了一个关于该Swap()函数的实例,这个过程就叫实例化模板函数。

      通过上面的比较我们就可以清楚的看出来,具体化函数模板其实是一个有针对性的构思,而实例化模板函数却是一个行为,一个真真切切的动作。编译器会根据我们定义的模板在最终生成一个实例化之后的模板函数,我们就把这个由函数模板生成的函数叫做模板实例。而模板的定义在编译前是不会生成这样实例化的函数的,它只用于生成该函数的一个解决方案,^_^,也就是说,它为编译器生成一个认为可行的思路。所以说:

  • 显式实例化模板函数是在编译时根据某个非具体参数类型的函数模板创建了一个具体参数类型的完整函数,由于他只是具体化了函数的参数类型,并没有修改函数的功能,因此没有必要,也不能够重写函数的定义部分;
  • 具体化函数模板则即具体化了函数的参数类型,又要修改函数的功能。

p.s. 如果我们实例化模板函数之后还修改了其定义,那么编译器就会报错,程序如下:

#include 
using namespace std;struct people{ char name[10]; int age;};template
void Swap(ElementType &a,ElementType &b){ ElementType temp; temp=b; b=a; a=temp; }//template<>void Swap
(people &a,people &b)void Swap
(people &a,people &b){ int temp; temp=b.age; b.age=a.age; a.age=temp;}int main(){ int x=1,y=2; cout<<"交换之前,x="<
<<"\ty="<
<

生成的错误指向19行,错误内容就是““Swap”: 非法使用显式模板参数”。

     

转载于:https://www.cnblogs.com/uniqueliu/archive/2011/08/11/2134745.html

你可能感兴趣的文章
BZOJ_1031_[JSOI2007]_字符串加密_(后缀数组)
查看>>
[osg]osg窗口显示和单屏幕显示
查看>>
前端技术在线文档地址链接
查看>>
077_打印各种时间格式
查看>>
[LeetCode] 101. Symmetric Tree_ Easy tag: BFS
查看>>
前端基础之html
查看>>
.Net基础之3——运算符
查看>>
scrapy管道MySQL简记
查看>>
使用 jQuery Deferred 和 Promise 创建响应式应用程序
查看>>
Bzoj1013--Jsoi2008球形空间产生器
查看>>
报文格式【定长报文】
查看>>
RDLC报表钻取空白页问题
查看>>
OS X升级到10.10之后使用pod出现问题的解决方法
查看>>
多路电梯调度的思想
查看>>
jQuery-对Select的操作
查看>>
过滤器、监听器、拦截器的区别
查看>>
为什么要进行需求分析?通常对软件系统有哪些需求?
查看>>
Oracle RAC环境下ASM磁盘组扩容
查看>>
添加web引用和添加服务引用有什么区别?
查看>>
一些模板
查看>>