标题:C++中函数模板显示具体化问题大家快来看看啊~(已解决)
只看楼主
沿途有鬼
Rank: 1
等 级:新手上路
帖 子:68
专家分:0
注 册:2008-7-20
 问题点数:0 回复次数:8 
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;
}



        

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

[[it] 本帖最后由 沿途有鬼 于 2008-8-5 18:08 编辑 [/it]]
搜索更多相关主题的帖子: 中函数 模板 具体化 std void 
2008-07-28 21:23
zerocn
Rank: 1
等 级:新手上路
帖 子:126
专家分:0
注 册:2006-4-11
得分:0 
显式具体化templete<type>
如templete<int>
2008-07-28 21:29
很远的那颗星
Rank: 2
等 级:新手上路
威 望:4
帖 子:544
专家分:0
注 册:2008-6-30
得分:0 
template<> void maxn(T * ar[],int n);//这个显示具体化错在哪里?

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

Fighting~~~~~~~~
2008-07-28 23:08
hank_wh
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2008-7-14
得分:0 
已经定义了模板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-07-30 01:35
hank_wh
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2008-7-14
得分:0 
也就是说你定义的这个模板不是通用的,对指针数组和数组这两种不能通用
2008-07-30 01:37
zerocn
Rank: 1
等 级:新手上路
帖 子:126
专家分:0
注 册:2006-4-11
得分: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;
}

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

模板显式特化我不会
2008-08-01 13:45
zerocn
Rank: 1
等 级:新手上路
帖 子:126
专家分:0
注 册:2006-4-11
得分:0 
程序代码:
#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-08-02 17:40
沿途有鬼
Rank: 1
等 级:新手上路
帖 子:68
专家分:0
注 册:2008-7-20
得分:0 
非常感谢3楼,4楼,7楼的回答啊,现在我弄懂了~

特别感谢zerocn的超级详细解答,让我晃然大悟啊~
2008-08-05 10:25
NEOGX
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-4-6
得分:0 
太感谢zerocn的超级详细解答,这阵子我也在做c++ primer的习题,虽然不是很难,但是基本概念搞不清不是不行
2008-08-22 17:12



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-225620-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.120040 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved