函数模板指定了怎样根据一组或更多实际类型或值构造出独立的函数。这个构造过程被称为模板实例化。这个过程是隐式发生的,它可以被看作是函数模板调用或取函数模板的地址的副作用。
为了判断用作模板实参的实际类型和值,编译器需要检查函数调用中提供的函数实参的类型。用函数实参的类型来决定模板实参的类型和值的过程被称为模板实参推演。我们也可以不依赖模板实参推演过程,而是显式地指定模板实参。
在取函数模板实例的地址时,必须能够通过上下文环境为一个模板实参决定一个唯一的类型或值。如果不能决定出这个唯一的类型或值,就会产生编译时错误。如:
template <typename Type,int size>
Type min( Type ( &r_array ) [ size ] ) { /* . . . */ }
typedefint (&rai) [10];
typedef double (&rad) [20];
void func( int (*) (rai) );
void func( double (*) (rad) );
int main() {
//错误:到底是哪一个min()的实例?
func( &min );
}
因为func()函数被重载了,所以编译器不能通过查看func()的参数类型,来为模板参数Type决定唯一的类型,以及为size的模板实参决定一个唯一值。我们可以用一个强制类型转换显式地指出实参的类型来消除编译时错误:
int main() {
//OK:强制转换指定实参类型
func(static_cast< double(*)(rad) >(&min));
}
但是更好的方案是用显式模板实参。
分享到:
相关推荐
函数模板 建立一个通用的函数,函数类型和形参不具体指定,用一个虚拟的类型代表。 只要是函数体是相同的就可以用这个模板代替。 (只适用于函数的参数个数相同而类型不同,且函数体一致的情况,如果参数个数不同,则...
C++基础的学习笔记(其中的代码源件可私信留言) C++中的空头程序 使用C++书写hello world 学习变量 学习常量 标识符命名规则 数据类型 运算符 程序流程结构 数组 函数 指针 结构体
C++学习笔记--函数指针 函数指针 程序运行期间。每个函数都会占用一段连续的内存空间。而函数名就是该函数所占内存区域的起始地址(也称“入口地址”)。我们可以将函数入口地址赋给一个指针变量,使该指针变量...
C++学习路线(csdn)————程序
谭浩强老师c++课本函数模板例题,c++函数模板使用,供大家学习使用。
个人网课学习笔记
Cocos2d-x学习笔记——完全掌握C++ API与游戏项目开发.zip
c++入门语法及使用 - c++学习路线(csdn)————程序
Pascal转C++学习笔记——1.基本知识
练习 C++中函数模板、类模板的创建和使用方法。 (1) 理解模板的作用。 (2) 学习函数模板及其声明方法,掌握模板函数及其生成方法。...(3) 学习函数模板的两种不同的实例化方法。 (4) 学习类模板的声明与使用方法。
其中,template为关键字,表示定义一个模板(可以是函数模板或类模板),尖括号表示模板参数,模板类型参数使用关键字class或typename开始,其后是一个用户定义的合法的标识符。 如果用户在调用函数模板时显式标识...
Pascal转C++学习笔记——2.基本语句与体系
一 函数重载 二函数模板 三类模板 的说明及代表代码
C++实例——垃圾清理系统
P167~184C++类和函数模板学习笔记.docx
C++实例——视频聊天系统
关于学习C++《STL模板库》以及学习《STL源码剖析》的学习笔记。
C++实例——考试管理系统
(2)编写一个函数把华氏温度转换为摄氏温度,转换公式为C= (F一32)*5/9。 (3)编写重载函数Maxl可分别求取两个整数,三个整数,两个双精度数,三个双精度数的最大值。 (4)使用重载函数模板重新实现上小题中的...