一个函数模板显示特化的问题,请高手指教!

bluishglc
博客专家认证
2005-08-19 10:35:47
这是一个关于函数模板显示特化的程序,程序如下:

//////////////////////////////////////////////////////////
//
//一个运用模板对各种数据类型进行排序的程序
//
//////////////////////////////////////////////////////////

#include <iostream>
using namespace std;

//模板函数声明
template<class Type,int size>
void sort(Type (&array)[size]);
//特化版本的模板函数声明
template<>
void sort<char*>(char* (&array)[size]);

//主程序
main()
{
int i;
//用于测试模板函数
int iarray[10]={3,6,7,6,9,21,43,12,45,31};
double darray[8]={23.8,34.8,32.8,12.7,67.2,31.9,88.4,39.7};
//用于测试模板函数的特化版本
char *parray[6]={"wofjeoif","oyfiije","fwof","hwofj","lks","isf"};

cout<<"Before sort:"<<endl;
for(i=0;i<10;i++)
{
cout<<iarray[i]<<" ";
}
cout<<"\nAfter sort:"<<endl;
sort(iarray);
for(i=0;i<10;i++)
{
cout<<iarray[i]<<" ";
}

cout<<"\nBefore sort:"<<endl;
for(i=0;i<8;i++)
{
cout<<darray[i]<<" ";
}
cout<<"\nAfter sort:"<<endl;
sort(darray);
for(i=0;i<8;i++)
{
cout<<darray[i]<<" ";
}
cout<<"\nBefore sort:"<<endl;
for(i=0;i<6;i++)
{
cout<<"["<<parray[i]<<"]"<<" ";
}
cout<<"\nAfter sort:"<<endl;
sort(parray);
for(i=0;i<6;i++)
{
cout<<"["<<parray[i]<<"]"<<" ";
}
cout<<endl;

}
//模板定义
template <class Type,int size>
void sort(Type (&array)[size])
{
Type temp;
int i,j;
for(i=0;i<size-1;i++)
for(j=i+1;j<size;j++)
if(array[i]>array[j])
{
temp=array[i];array[i]=array[j];array[j]=temp;
}
}
//特化版本的定义
template<>
void sort<char*>(char* (&array)[size])
{
char* temp;
int i,j;
for(i=0;i<size;i++)
for(j=i+1;j<size;j++)
if(strcmp(array[i],array[j])>0)
{
temp=array[i];array[i]=array[j];array[j]=temp;
}
}

问题出在特化版本的非类型实参上。该程序在vc.net 2003上编译时显示:
“size”: 即使使用参数相关的查找,也未找到标识符
当把特化版本去除,只对iarray和darray排序是没有问题的,可以直接通过,但是一但加入对parray
进行排序的特化版本时,就出现上述问题,这是为什么?为什么在特化版本里size的值就不能通过传递的数组引用而确定下来呢?
望高手指点,小弟将不盛感激!
...全文
192 8 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
SammyLan 2005-08-20
说笑
走人 /go
  • 打赏
  • 举报
回复
SammyLan 2005-08-20
回复人: bluishglc(孤独的鱼) ( ) 信誉:100 2005-08-20 10:27:00 得分: 0
太感谢了,我知道了!谢谢!

感谢要行动啊,我只看分的哦
20分全部给我吧 ^_^ ^_^


  • 打赏
  • 举报
回复
xinxiakk 2005-08-20
顶一下,希望大家帮着解决一下
  • 打赏
  • 举报
回复
xinxiakk 2005-08-20
比如,如下的程序,
#include<fstream.h>
template <typename Type ,int size>
Type min(Type (&r_array)[size])
{
size++;
return size;
}
int sa[3]={3,8,6};
void main()
{
int b=min(sa);
cout<<b<<endl;
}

连编译都通不过,提示2个错误
'<Unknown>' : reference to a zero-sized array is illegal
'Type __cdecl min(Type (&)[1])' : could not deduce template argument for ' (&)[1]' from 'int [3]'
  • 打赏
  • 举报
回复
xinxiakk 2005-08-20
我倒不明白了,数组的size是怎么传进去的,数组的size好像并不和其本身有什么关系,请高手指教
  • 打赏
  • 举报
回复
bluishglc 2005-08-20
太感谢了,我知道了!谢谢!
  • 打赏
  • 举报
回复
SammyLan 2005-08-19
建议你重载sort如下
template<int size>
void sort(char* (&array)[size]){}
  • 打赏
  • 举报
回复
SammyLan 2005-08-19
当模板参数里面有内置类型参数的时候
要特化他,内置模板类型参数必须确定下来(也就是你这里的size要有一个确定的数)
所以当模板带有内置类型参数的时候,一般不特化
你可以考虑重载
  • 打赏
  • 举报
回复
相关推荐
发帖
C++ 语言

6.2w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2005-08-19 10:35
社区公告
暂无公告