C++-C++ 模板函数显式具体化的问题

发布于 2017-07-20 19:05:08 字数 2337 浏览 1311 评论 1

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 FilesMicrosoft Visual StudioMyProjects程序文本8.8.6.cpp(6) : error C2912: explicit specialization; 'const char *__cdecl Maxn(const char *[],int)' is not a function template
C:Program FilesMicrosoft Visual StudioMyProjects程序文本8.8.6.cpp(6) : see declaration of 'Maxn'
C:Program FilesMicrosoft Visual StudioMyProjects程序文本8.8.6.cpp(39) : error C2912: explicit specialization; 'const char *__cdecl Maxn(const char *[],int)' is not a function template
C:Program FilesMicrosoft Visual StudioMyProjects程序文本8.8.6.cpp(6) : see declaration of 'Maxn'
C:Program FilesMicrosoft Visual StudioMyProjects程序文本8.8.6.cpp(39) : error C2912: explicit specialization; 'const char *__cdecl Maxn(const char *[],int)' is not a function template

C:Program FilesMicrosoft Visual StudioMyProjects程序文本8.8.6.cpp(6) : see declaration of 'Maxn'

总是在我的显示具体化函数那里报错,说他不是一个函数模板,什么意思啊
求高手赐教
后来我自己把所有模板包括具体化中的const都去掉了,全部去掉后,程序就正常运行了,求指教?这事为什么啊? 注:运行环境vc++6.0

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

晚风撩人 2017-09-08 13:55:10

提问者本人其实已经触摸到了答案的边:如果去掉所有的 const 编译就能通过。事实上,这个错误与模板机制无关,而是基本功:类型定义的问题。

在模板的定义中, const T 所代表的是一个常量。那么 const char* 是一个常量吗?不是,它是一个非常量指针(编译器允许改变它的值,让它指向别处),指向一个常量(编译器不允许修改它所指向的内容)。所以,编译器判定显式特化与函数模板定义不匹配。

正确写法是:

template<> char* const Maxn(char* const pc[],int n)
{ ... }

// 如果硬是手贱非要把 const 写到前面的话,也可以这样,与上面等效
typedef char* CharPtr;
template<> const CharPtr Maxn(const CharPtr pc[], int n)
{ ... }

// 也可以这样,但请注意,这与上面的代码是有区别的
template<> const char* const Maxn(const char* const pc[],int n)
{ ... }

事实上,修改后的代码与提问者的原意恐怕多少有些不符,我个人猜测,最后一种恐怕最接近提问者的原意——不过,那是另一个问题了——这个问题一定要说的话,给两个提示:
1、对于模板函数中的指针型参数,通常都要专门重载或特化,C++专门提供指针特化语法不是用来好看的哦;
2、凡是 const char* 引起的麻烦,通常都能用 const std::string& 解决。

最后:建议楼主使用术语时更严谨一些,你这个情况是特化(specilize),而不是具现化(instanciate)。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文