在学习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' 展开
#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' 展开
5个回答
展开全部
理论上不应该报这个错,因为在候选调用存在二义性的情况下,会从可行函数集中优先去掉函数模板实例。在此例中,这样操作的结果便剩下一个唯一的普通函数适用,不存在二义性。
实际上,用gcc编译时,报的是另外一个错误:error: invalid initialization of reference of type 'int&' from expression of type 'char'
将swap(i,b);改为swap(i, (int&)b);则正常调用普通重载函数。
实际上,用gcc编译时,报的是另外一个错误:error: invalid initialization of reference of type 'int&' from expression of type 'char'
将swap(i,b);改为swap(i, (int&)b);则正常调用普通重载函数。
展开全部
swap(i,b)这个语句的问题。
swap(int, char)这样的调用有二义性,既可以是特殊版本,也可以模板那个版本,编译器不知道如何选择,所以只有报错。
i,b是不通的类型,系统找不到该函数,所以要报错,其实也可以在上面重载这类型。
void swap(int& x,char& y)
{
return;
}
swap(int, char)这样的调用有二义性,既可以是特殊版本,也可以模板那个版本,编译器不知道如何选择,所以只有报错。
i,b是不通的类型,系统找不到该函数,所以要报错,其实也可以在上面重载这类型。
void swap(int& x,char& y)
{
return;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
swap(i,b)这个语句的问题吧
swap(int, char)这样的调用有二义性,既可以是特殊版本,也可以模板那个版本,编译器不知道如何选择,所以只有报错
swap(int, char)这样的调用有二义性,既可以是特殊版本,也可以模板那个版本,编译器不知道如何选择,所以只有报错
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
i,b是不通的类型,系统找不到该函数,所以要报错,其实你也可以在上面重载这类型
void swap(int& x,char& y)
{
return;
}
void swap(int& x,char& y)
{
return;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
模板实例化时不支持隐式类型转换,你在自己的注释中不也说了吗!
那个普通函数可视为模板的一个特例化,不存在二义性的说法。
那个普通函数可视为模板的一个特例化,不存在二义性的说法。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询