普通函数与函数模板的调用规则

调用规则如下:

  1. 如果函数模板和普通模板都可以实现,优先调用普通模板
  2. 可以通过空模板参数列表来强制调用函数模板。
  3. 函数模板也可以发生重载
  4. 如果函数模板可以产生更好的匹配,优先调用函数模板。

示例:

#include<iostream>
using namespace std;
//普通函数与函数模板的调用规则
 void myPrint(int a,int b)
 {
 	cout<<"普通函数被调用"<<endl;
 }
 
 template<typename T>
 void myPrint(T a,T b)
 {
 	cout<<"函数模板被调用"<<endl;
 }
 
 template<typename T>
 void myPrint(T a,T b,T c) 
 {
 	cout<<"调用重载的模板"<<endl;
 }
 
 void test01()
 {
 	//1.如果函数模板和普通函数都可以实现,优先调用普通函数。
	 //注意 如果告诉编译器 普通函数是有的,但只是声明没有实现,或者不在当前文件内实现,就会报错找不到
	 int a=10;
	 int b=20;
	  myPrint(a,b);//普通函数被调用
	  
	  //2.可以通过空模板参数列表来强制调用函数模板
	   myPrint<>(a,b);//函数模板被调用
	   
	   //3.函数模板也可以发生重载
	   int c=30;
	    myPrint(a,b,c);//调用重载的模板
	    
	    //4.如果函数模板可以参数更好的匹配,优先调用函数模板
		char c1='a';
		char c2='v';
		 myPrint(c1,c2);//函数模板被调用
	    
  } 
int main()
{
	test01(); 
	system("pause");
	return 0;
 } 

 总结:

既然提供了函数模板,最好不要提供普通函数,否则容易出现二义性

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
函数模板的定义与使用的常见问题包括以下几点: 1. 如何定义函数模板函数模板的一般形式为: ```cpp template <typename T> 返回类型 函数名(形参表){ // 函数体 } ``` 其中,`typename T`表示模板参数,可以是任意类型。 2. 如何使用函数模板? 使用函数模板时,需要在函数名后面加上尖括号`<>`,并在尖括号中指定具体的类型。例如: ```cpp 函数名<具体类型>(实参表); ``` 3. 如何进行函数模板的特例化? 函数模板的特例化是指为特定类型提供特定的实现。特例化的语法如下: ```cpp template <> 返回类型 函数名<特定类型>(形参表){ // 特定类型的实现 } ``` 特例化的优先级比普通函数模板低,但比非模板函数高。 4. 函数模板普通函数调用优先级如何? 当程序中同时定义同名的函数模板普通函数时,编译器处理函数调用时的优先级如下: - 非模板函数优先级最高; - 模板特例化次之; - 最后调用函数模板。 5. 函数模板的实参推断规则是什么? 函数模板的实参推断是指根据函数调用时提供的实参,推断出模板参数的具体类型。实参推断规则如下: - 如果实参的类型与模板参数的类型完全匹配,则直接使用该类型; - 如果实参的类型可以隐式转换为模板参数的类型,则使用转换后的类型; - 如果实参的类型无法匹配模板参数的类型,则编译器报错。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值