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上编译出错,指出标记行函数调用有二义性,求高手帮忙解释下为什么 展开
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上编译出错,指出标记行函数调用有二义性,求高手帮忙解释下为什么 展开
展开全部
类型参数可以匹配任意类型,你的这个重载肯定会有二义性
因为Show(pd,3);这个实例化既可以匹配void Show(T arr[],int n) ,推导出T 是double *,也可以匹配void Show(T *arr[],int n) 推导出T是double
所谓模板的特别化其实不是这样重载,是直接用某类型去实现一个特别的函数
因为Show(pd,3);这个实例化既可以匹配void Show(T arr[],int n) ,推导出T 是double *,也可以匹配void Show(T *arr[],int n) 推导出T是double
所谓模板的特别化其实不是这样重载,是直接用某类型去实现一个特别的函数
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
““更具体”的将会被选用”是有前提的,那就是调用无二义性。
但是,你这里的调用明显存在着二义性(即 调用谁都是可以的),当然报错了。
但是,你这里的调用明显存在着二义性(即 调用谁都是可以的),当然报错了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
未采纳已删除
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询