我的错?书的错?还是我的编译器的错?

来源:百度知道 编辑:UC知道 时间:2024/05/28 06:52:00
#include <iostream>
using namespace std;

template <typename T>
void showarr (T arr[] , int n);

template <typename T>
void showarr (T * arr[] , int n);

struct debts
{
char name [50];
double amount;
};

int main ()
{
int things[6] = {13,31,103,301,310,130};
struct debts mr_E[3] =
{
{"Ima wolfe" , 2400.0},
{"Ura Foxe" , 1300.0},
{"Iby Stout", 1800.0}
};

double * pd[3];
for (int i = 0 ; i< 3 ;i++)
pd[i] = &mr_E [i].amount;
cout << "things: \n";
showarr (things,6);
cout << "debts: \n";
showarr ( pd, 3); //A 处
return 0;
}

template <typename T>
void showarr (T arr[] , int n)
{

cout << "Template A \n";
for(int i = 0 ; i < n ; i+

首先:VC 6.0 对标准不是很支持。
第二:这个例子是正确的,g++ 可以编译。所以你可以放心,不是你错,也不是书错,是VC6.0的错。
第三:我可以肯定地告诉你这个showarr ( pd, 3); 调用的是
template <typename T>
void showarr (T * arr[] , int n);
虽然
两个重载版本都是可行的,比如 把 double bind 到 T 或者是把 double * bind 到T 但是对于
template <typename T>
void showarr (T * arr[] , int n);
把double bind 到 T
与下面相比
template <typename T>
void showarr (T arr[] , int n)
中把 double * bind 到 T

前者具有更特化的性质,所以编译器选择前者。
至于更特化的定义和解释请查看c++ primer 3 的 函数模板重载 参数推导一节。

二楼分析的不全无道理,但是他忽略了模板实例化的更特化性质。
楼主的例子是正确的,不用怀疑,g++可以编译。

我也不懂啊 不过我有个问题 在摸板函数中实例化的时候到底调用哪个函数啊

VC6.0和7.0都编译不过去。
个人理解:
经过测试,如果不使用模板,上述重载函数没有问题,可以正确匹配,因此问题在模板上。
重载函数时,
1.编译器首先要设置候选函数集合,A处调用来说,两个重载函数的个数和类型都可以,(T有可能是double*);
2.通过类型转换匹配可行函数,此时由于T有可能是指针类型,则第一个重载函数与第二个重载函数是等价的;
3.选择最佳函数,由于上述两个函数等价,故优先级相同,因此没有哪个是best conversion,由此引起二义性,不能通过编译。