C++重载解析的问题

#include<iostream>template<classT>voidShow(Tarr[],intn);template<classT>voidShow(T*ar... #include<iostream>
template<class T>
void Show(T arr[],int n);
template<class T>
void Show(T * arr[],int n);//模板重载,第一个形参为指向类型T的指针数组(数组元素为指针)
struct debt{
char name[50];
double amount;
};
using namespace std;
int main()
{
using namespace std;
debt mr_E[3]={
{"Ima Wolfe",2400.0},
{"Ura Foxe ",1300.0},
{"Iby Stout",1800.0}
};//初始化结构数组
double* pd[3];//指针数组,数组元素为指向double的指针
for (int i=0;i<3;i++)
pd[i]=&mr_E[i].amount;
int arr[6]={1,2,3,4,5,6};
cout<<"Listing number:\n";
Show(arr,6);
cout<<"Listing debts:\n";
Show(pd,3); //此行报错
return 0;
}
template<class T>
void Show(T arr[],int n)
{
cout<<"Template A:\n";
for (int i=0;i<n;i++)
cout<<arr[i]<<' ';
cout<<endl;
}
template<class T>
void Show(T *arr[],int n)
{
cout<<"Template B:\n";
for (int i=0;i<n;i++)
cout<<*arr[i]<<' ';
cout<<endl;
}
这是书上的一个例子,函数模板重载了,在程序运行到标记行时,pd本身是一个指针数组名,数组元素是指向double的指针。调用函数时,两种模板函数在接口上都是可以匹配的对于前者,可以将T 替换为double*,,,而后者可以将T替换成double,因此从接口上来说都是匹配的,因此书上说对于都是模板函数的情况,“更具体”的将会被选用,由于重载的模板做出了特定的假设(数组内容就是指针),因此更符合调用,从而此处会调用重载的模板。 但是我在vc6.0上编译出错,指出标记行函数调用有二义性,求高手帮忙解释下为什么
展开
 我来答
adoqq_bd
2012-07-15 · TA获得超过7050个赞
知道大有可为答主
回答量:1818
采纳率:63%
帮助的人:1603万
展开全部
是的,vc6就是会把double*看成T而去匹配 void Show(T arr[],int n);,将double* 看成T*这样的“更具体”的类型是c++的标准,而vc6有自己的一套标准,这是没办法的事,要么换个函数名,要么显式具体化,最好是换个编译器 ,从vc7(.net2002)开始,vc对c++标准的遵循有了本质的变化,到目前的vc2010可以说是无限靠近了 (这段代码在vc2010下没有问题)
chiconysun
2012-07-15 · TA获得超过2.2万个赞
知道大有可为答主
回答量:5410
采纳率:92%
帮助的人:2549万
展开全部
类型参数可以匹配任意类型,你的这个重载肯定会有二义性
因为Show(pd,3);这个实例化既可以匹配void Show(T arr[],int n) ,推导出T 是double *,也可以匹配void Show(T *arr[],int n) 推导出T是double

所谓模板的特别化其实不是这样重载,是直接用某类型去实现一个特别的函数
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
笃侠6A
2012-07-15 · TA获得超过3734个赞
知道大有可为答主
回答量:3205
采纳率:75%
帮助的人:3245万
展开全部
““更具体”的将会被选用”是有前提的,那就是调用无二义性。
但是,你这里的调用明显存在着二义性(即 调用谁都是可以的),当然报错了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友9308069
2012-07-15 · TA获得超过1万个赞
知道大有可为答主
回答量:3947
采纳率:89%
帮助的人:1895万
展开全部
未采纳已删除
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式