| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
高端软件开发 = 年薪十万不是梦   
共有 383 人关注过本帖
标题:C++中函数模板显示具体化问题大家快来看看啊~(已解决)
收藏  订阅  推荐  打印
沿途有鬼
Rank: 2
等级:注册会员
帖子:68
积分:882
注册:2008-7-20
C++中函数模板显示具体化问题大家快来看看啊~(已解决)

#include<iostream>
using namespace std;

template <class T>
void ShowArray(T arr[],int n);



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


template <> void ShowArray<char *>(char * arr[],int n);

int main(void)
{
    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<<"Listing Mr. E's counts of things: \n";

    ShowArray(things,6);

    cout<<"Listing Mr. E's debts: \n";

        ShowArray(pd,3);//有错
        return 0;
}

template <class T>
void ShowArray(T arr[],int n)
{
    T sum=0;
    cout<<"template A\n";
    for(int i=0;i<n;i++)
        sum=sum+arr[i];//1有错
    cout<<"Sum things are "<<sum<<endl<<endl;
}

template <> void ShowArray<char *>(char * arr[],int n)
{
    double sum=0;
        cout<<"template B\n";
            for(int i=0;i<n;i++)
        sum=sum+*arr[i];
            cout<<"Sum debts are "<<sum<<endl<<endl;
}



        

请帮我把程序改正确,能够指点一下更加感谢啊~

[ 本帖最后由 沿途有鬼 于 2008-8-5 18:08 编辑 ]
2008-7-28 21:23
zerocn
Rank: 2
等级:注册会员
帖子:124
积分:1458
注册:2006-4-11

显式具体化templete<type>
如templete<int>
2008-7-28 21:29
很远的那颗星
Rank: 3Rank: 3
等级:中级会员
威望:2
帖子:466
积分:4217
注册:2008-6-30

template<> void maxn(T * ar[],int n);//这个显示具体化错在哪里?

//template<> 这里你都没给类型

Fighting~~~~~~~~
2008-7-28 23:08
hank_wh
Rank: 1
等级:新手上路
帖子:14
积分:256
注册:2008-7-14

已经定义了模板template <class T>
void ShowArray(T arr[],int n);
为什么还要定义这个template <> void ShowArray<char *>(char * arr[],int n);这是不必要的
ShowArray(pd,3),pd是个数组,数组元素是指向double的指针,传到模板里,T就是double*,arr[i]是元素地址,所以违背你的目的
2008-7-30 01:35
hank_wh
Rank: 1
等级:新手上路
帖子:14
积分:256
注册:2008-7-14

也就是说你定义的这个模板不是通用的,对指针数组和数组这两种不能通用
2008-7-30 01:37
zerocn
Rank: 2
等级:注册会员
帖子:124
积分:1458
注册:2006-4-11

template <class T>
void ShowArray(T arr[],int n)
{
    T sum=0;
    cout<<"template A\n";
    for(int i=0;i<n;i++)
        sum=sum+arr[i];//1有错
    cout<<"Sum things are "<<sum<<endl<<endl;
}

错是错在arr[i];T arr[]这样定义不是定义了一个数组对象,而是一个指针,如果实参只是一个int型变量,那么arr[i]就不合法了。

模板显式特化我不会
2008-8-1 13:45
zerocn
Rank: 2
等级:注册会员
帖子:124
积分:1458
注册:2006-4-11

复制内容到剪贴板
代码:
#include<iostream>
#include <cstdlib>
using namespace std;



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

template <class T>
void ShowArray(T *arr,int n)
{   
    T sum=0;
    cout<<"template A\n";
    for(int i=0;i<n;i++)
    sum=sum+*(arr+i);
    cout<<"Sum things are "<<sum<<endl<<endl;
}

template <> void ShowArray<debts *>(debts * *arr,int n)
{
    double sum=0;
        cout<<"template B\n";
            for(int i=0;i<n;i++)
        sum=sum+(**(arr+i)).amount;
            cout<<"Sum debts are "<<sum<<endl<<endl;
}


int main(void)
{
    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}
    };

    debts * pd[3];

    for(int i=0;i<3;i++)
        pd[i]=&mr_E[i];

    cout<<"Listing Mr. E's counts of things: \n";

    ShowArray(things,6);

    cout<<"Listing Mr. E's debts: \n";

    ShowArray(pd,3);
     system("pause");
     return 0;
}
对你的程序做了点修改,第一个错已经在上面一贴中说明了

说明:对本贴的程序
因为pd是指针数组,所以pd是一个指向指针的指针即debts **类型
模板需要的的是T * 类型,所以实例化时,T的类型是debts *类型 最终的模板是
void ShowArray(debts ** arr,int n)
现在知道实例化的时候T的类型了,那么现在进行现死特化的分析
template<> void ShowArray<这里是T的类型,而不是调用是实参的类型>(首先是T的类型,然后是函数的类型)
具体如下:
template<> void ShowArray<debts *>(debts * *arr,int n)
现正arr的类型是指向指针的指针。
2008-8-2 17:40
沿途有鬼
Rank: 2
等级:注册会员
帖子:68
积分:882
注册:2008-7-20

非常感谢3楼,4楼,7楼的回答啊,现在我弄懂了~

特别感谢zerocn的超级详细解答,让我晃然大悟啊~
2008-8-5 10:25
NEOGX
Rank: 1
等级:新手上路
帖子:3
积分:138
注册:2007-4-6

太感谢zerocn的超级详细解答,这阵子我也在做c++ primer的习题,虽然不是很难,但是基本概念搞不清不是不行
2008-8-22 17:12
共有 382 人关注过本帖
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.055508 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved