在学习C++类属模板函数时遇到的问题

我在学习C++类属模板函数时遇到了这个问题,程序如下:#include<iostream.h>template<classTYPE>voidswap(TYPE&x,TYP... 我在学习C++类属模板函数时遇到了这个问题,程序如下:
#include <iostream.h>
template <class TYPE>
void swap(TYPE& x,TYPE& y)
{
TYPE temp;

temp=x;
x=y;
y=temp;
cout<<"Calling generic version of swap().\n";
return;
}

void swap(int& x,int& y)
{
int temp;

temp=x;
x=y;
y=temp;
cout<<"Calling special version of swap().\n";
return;
}

int main()
{
int i=10,j=20;
double x=1.44,y=3.14;
char a='x',b='y';

swap(i,j);//调用特殊版本
swap(x,y);//实例化类属函数
swap(a,b);//实例化类属函数
swap(i,b);//隐式转换后实例化类属函数(实际上这里不能进行隐式类型转化,报错!)
return 1;
}

我的疑问是:swap(i,b)按照书上的讲解是应该进行隐式类型转化然后去调用特殊版本的swap(),也就是将b转化成int型。但是编译通不过。原因在于它实际上试图去实例化类属函数swap(TYPE)而造成二义性。那书上的说法是不是有问题呀? 请哪位高手解释一下。
错误信息:error C2782: 'void __cdecl swap(TYPE &,TYPE &)' : template parameter 'TYPE' is ambiguous
could be 'char'
or 'int'
展开
 我来答
n维向量
推荐于2019-08-09 · TA获得超过539个赞
知道小有建树答主
回答量:160
采纳率:0%
帮助的人:0
展开全部
理论上不应该报这个错,因为在候选调用存在二义性的情况下,会从可行函数集中优先去掉函数模板实例。在此例中,这样操作的结果便剩下一个唯一的普通函数适用,不存在二义性。
实际上,用gcc编译时,报的是另外一个错误:error: invalid initialization of reference of type 'int&' from expression of type 'char'
将swap(i,b);改为swap(i, (int&)b);则正常调用普通重载函数。
Sweet丶奈何
高粉答主

2015-11-05 · 每个回答都超有意思的
知道大有可为答主
回答量:2.8万
采纳率:82%
帮助的人:4841万
展开全部
swap(i,b)这个语句的问题。
swap(int, char)这样的调用有二义性,既可以是特殊版本,也可以模板那个版本,编译器不知道如何选择,所以只有报错。
i,b是不通的类型,系统找不到该函数,所以要报错,其实也可以在上面重载这类型。
void swap(int& x,char& y)
{
return;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
疾似云流
2009-02-24 · TA获得超过1159个赞
知道小有建树答主
回答量:1093
采纳率:0%
帮助的人:486万
展开全部
swap(i,b)这个语句的问题吧
swap(int, char)这样的调用有二义性,既可以是特殊版本,也可以模板那个版本,编译器不知道如何选择,所以只有报错
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
suiyue_2009
2009-02-24 · TA获得超过846个赞
知道小有建树答主
回答量:1248
采纳率:0%
帮助的人:885万
展开全部
i,b是不通的类型,系统找不到该函数,所以要报错,其实你也可以在上面重载这类型
void swap(int& x,char& y)
{

return;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
uwinb
2009-02-25 · TA获得超过186个赞
知道小有建树答主
回答量:199
采纳率:0%
帮助的人:183万
展开全部
模板实例化时不支持隐式类型转换,你在自己的注释中不也说了吗!
那个普通函数可视为模板的一个特例化,不存在二义性的说法。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式