C++语言函数申明对函数模板实例化的屏蔽
小标 2018-06-15 来源 : 阅读 742 评论 0

摘要:本文主要向大家介绍了C++语言函数申明对函数模板实例化的屏蔽,通过具体的代码向大家展示,希望对大家学习C++语言有所帮助。

本文主要向大家介绍了C++语言函数申明对函数模板实例化的屏蔽,通过具体的代码向大家展示,希望对大家学习C++语言有所帮助。

1.C++函数匹配顺序

C++语言引入模板机制后,函数调用的情形显的比C语言要复杂。当发生一次函数调用时,如果存在多个同名函数,则C++编译器将按照如下的顺序寻找对应的函数定义。 
(1)寻找一个参数完全匹配的函数,如果找到了就调用它。 
(2)寻找一个函数模板,并根据调用情况进行参数推演,如果推演成功则将其实例化,并调用相应的模板函数。 
(3)如果前面两种努力都失败了,则试着低一级的函数匹配方法,如通过类型转换能否达到参数匹配,如果可以,则调用它。

2. 函数申明对函数模板实例化的屏蔽

如果使用了函数申明,可能会造成对函数模板实例化的屏蔽。考察如下程序。

#include <iostream>using namespace std;
int square(const int&);
template<class T>T square(const T&i){
    return i*i;
}
int main(){
    cout<<square(5)<<endl; //链接时出错
}

在这个程序中,如果没有函数申明int square(const int&),则函数调用square(5)一定会找到函数模板square并将其实例化。但是由于前面那个函数申明的存在,使得编译器认为一定有一个int square(const int&)存在,不启用函数模板的实例化,并尝试寻找该函数的定义,结果该函数并没有定义,就出现了连接时未找到该函数定义的错误。

这种现象,可以把它叫做函数申明对函数模板实例化的屏蔽。其本质是,在发生函数调用的时候,编译器总是优先调用普通函数而不是函数模板。要解决这个问题,可以采取以下三种办法。 
(1)去掉函数申明。 
(2)显示指明函数模板的类型参数,即显示模板实参调用(显示调用),将函数调用写成:square< int>(5); 
(3)将函数申明改为模板申明,即申明template< class T>T square(const T&);这样就会启用函数模板的实例化。这么做,本质上等同于第一条做法,去掉函数申明。

本文由职坐标整理并发布,了解更多内容,请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程