| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 946 人关注过本帖
标题:模板函数显式具体化的问题
只看楼主 加入收藏
LOV迪迪
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-7-14
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
模板函数显式具体化的问题
#include<iostream>
#include<cstring>
template<class T>
const T Maxn(const T arr[],int n);                        //模板函数
//
template<>const char* Maxn(const char* arr[],int n);       //模板函数显示具体化,此行报错
using namespace std;
int main()
{
int num[4]={1,2,3,4};
double dig[6]={1.1,2.2,3.3,4.4,5.5,6.6};
cout<<"The max of 4 int:"<<Maxn(num,4)<<endl<<endl;
cout<<"The max of 6 double:"<<Maxn(dig,6)<<endl<<endl;      //int,double数组来测试模板函数运行
char* pc[5]={
"nnnnnnnnnnnnn",
"nnn is a handsome and excellent boy!",
"wwwwwwwwwwwwwwww",
"sssssssssssss",
"swdefsfsdf"
};                                                          //创建指针数组。每个数组元素是指向一个字符串的指针
cout<<pc[1]<<endl<<endl<<endl;
cout<<"Your longest string is:\n"
<<Maxn(pc,5)<<endl;                                         //此处以指针数组名为参数,调用的应该是显示具体化的函数
return 0;
}
template<class T>
const T Maxn(const T arr[],int n)                          //模板函数体
{
T max=arr[0];
for (int i=1;i<n;i++)
if (max<arr[i])
max=arr[i];
return max;
}
template<>const char* Maxn(const char* pc[],int n)          //模板函数显示具体化,此行报错
{                                             
const char* pm=pc[0];
for (int i=1;i<n;i++)
if (strlen(pm)<strlen(pc[i]))
pm=pc[i];
return pm;
}
我是实在不知道自己错在哪里了,模板函数显示具体化,之前用着一直没事的啊,怎么这次我怎么看都不知道错在哪,程序编译无法通过,错误如下:
==============================================================
C:\Program Files\Microsoft Visual Studio\MyProjects\程序文本\8.8.6.cpp(6) : error C2912: explicit specialization; 'const char *__cdecl Maxn(const char *[],int)' is not a function template
        C:\Program Files\Microsoft Visual Studio\MyProjects\程序文本\8.8.6.cpp(6) : see declaration of 'Maxn'
C:\Program Files\Microsoft Visual Studio\MyProjects\程序文本\8.8.6.cpp(39) : error C2912: explicit specialization; 'const char *__cdecl Maxn(const char *[],int)' is not a function template
        C:\Program Files\Microsoft Visual Studio\MyProjects\程序文本\8.8.6.cpp(6) : see declaration of 'Maxn'
C:\Program Files\Microsoft Visual Studio\MyProjects\程序文本\8.8.6.cpp(39) : error C2912: explicit specialization; 'const char *__cdecl Maxn(const char *[],int)' is not a function template
        C:\Program Files\Microsoft Visual Studio\MyProjects\程序文本\8.8.6.cpp(6) : see declaration of 'Maxn'
=========================================================
总是在我的显示具体化函数那里报错,说他不是一个函数模板,什么意思啊
求高手赐教

[ 本帖最后由 LOV迪迪 于 2012-7-16 10:01 编辑 ]
搜索更多相关主题的帖子: include nnnnnnnnn max double 
2012-07-16 09:53
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:20 
程序代码:
#include<iostream>
#include<cstring>
template<class T>
const T Maxn(const T arr[],int n);                        //模板函数
//
template<class T>
const char* Maxn(const char* arr[],int n);       //模板函数显示具体化,此行报错
using namespace std;
int main()
{
    int num[4]={1,2,3,4};
    double dig[6]={1.1,2.2,3.3,4.4,5.5,6.6};
    cout<<"The max of 4 int:"<<Maxn(num,4)<<endl<<endl;
    cout<<"The max of 6 double:"<<Maxn(dig,6)<<endl<<endl;      //int,double数组来测试模板函数运行
    char* pc[5]={
        "nnnnnnnnnnnnn",
        "nnn is a handsome and excellent boy!",
        "wwwwwwwwwwwwwwww",
        "sssssssssssss",
        "swdefsfsdf"
    };                                                          //创建指针数组。每个数组元素是指向一个字符串的指针
    cout<<pc[1]<<endl<<endl<<endl;
    cout<<"Your longest string is:\n"
        <<Maxn(pc,5)<<endl;                                         //此处以指针数组名为参数,调用的应该是显示具体化的函数
    return 0;
}
template<class T>
const T Maxn(const T arr[],int n)                          //模板函数体
{
    T max=arr[0];
    for (int i=1;i<n;i++)
        if (max<arr[i])
            max=arr[i];
    return max;
}
template<class T>
const char* Maxn(const char* pc[],int n)          //模板函数显示具体化,此行报错
{                                              
    const char* pm=pc[0];
    for (int i=1;i<n;i++)
        if (strlen(pm)<strlen(pc[i]))
            pm=pc[i];
    return pm;
}


VS2008SP1编译通过,你多看看模版的用法...

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2012-07-16 13:15
LOV迪迪
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-7-14
收藏
得分:0 
回复 2楼 peach5460
你把我所有的函数显式具体化前缀template<>都改成了template<class T>,的确能编译通过了·····可是就失去了具体化的意义了,完全就是按照原模板函数在运行啊,运行结果输出最长字符串的那一项目输出的只是第一个字符串(这刚好是模板函数算法下的结果),但是用具体化的算法,返回的应该是最长的字符串
2012-07-20 11:28
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
我不知道是不是我模版没学到位
但是,我觉得
template<class T>
const char* Maxn(const char* pc[],int n) {}

或者
const char* Maxn(const char* pc[],int n) {}

都可以编译通过...
但是
template<>
const char* Maxn(const char* pc[],int n) {}
你又不用模版,你又指定模版函数...我没见过这样的用法

至于说具现化...
模版是在变异期间进行类型推断的...如果需要调用模版函数而非类型推断后的函数倒是可以template<> const char* Maxn(const char* pc[],int n) 这么调用
但是你不可能这么去定义函数...

[ 本帖最后由 peach5460 于 2012-7-20 12:47 编辑 ]

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2012-07-20 12:39
皮小鹏
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2017-10-7
收藏
得分:0 
显式具体化格式不对
古老的帖子,今天遇到同样的问题,不晓得题主问题搞定没。以后或许有人遇到同样的问题看到这个帖子,我来回复一下啦!
#include "stdafx.h"


template<typename T>const T maxn(const T arr[],int n);
template<> char* const maxn(char* const arr[], int n);

int main()
{
    using namespace std;
    int int_arr[5]{ 2,3,2,1,5 };
    char* str_arr[3]{"i am pixiaopeng","my name is pixiaopeng","i love you"};
    double double_arr[5]{ 2.3,5.7,1.2,3.6,8.3 };
    cout << maxn(int_arr, 5) << endl
        << maxn(double_arr, 5) << endl
        << maxn(str_arr, 3) << endl;
    return 0;
}

template<typename T>const T maxn(const T arr[],int n)
{
    T temp = arr[0];
    for (int i = 1; i < n; i++)
    {
        if (arr[i]>temp)
        {
            temp = arr[i];
        }
    }
    return temp;
}

template<> char* const maxn( char* const arr[],int n)
{
     char* temp = arr[0];
    for (int i = 1; i < n; i++)
    {
        if (strlen(arr[i])>strlen(temp))
        {
            temp = arr[i];
        }
    }
    return temp;
}
刚开始我和题主一样错误,百思不得其解,我用的visual studio 2015,把鼠标放在函数调用的位置,正确的写法就出来啦
2017-10-07 22:41
快速回复:模板函数显式具体化的问题
数据加载中...
 
   



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

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