回 帖 发 新 帖 刷新版面

主题:函数模板问题

编译没有错误但是运行结果不对
问题在我标红色的地方
不知道怎么改
//用冒泡排序法编写一个从小到大排序的函数模板,要求可以用int ,double,char,string,char*等类型数据进行验证
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
template<typename U,int size>
void ebusort(U (&arr)[size])     
{
        U temp;
        for(int i=0;i<size;i++)
                for(int j=0;j<size-i;j++)
                        if(arr[j]>arr[j+1])
                        {
                                temp=arr[j];
                                arr[j]=arr[j+1];
                                arr[j+1]=temp;
                        }
        for(int i=0;i<size;i++)
                cout<<arr<<"  ";
                cout<<endl;
}                              //[color=FF0000]这个排序模板可以用于int,double,char排序,但是数组的最后一个值输出得不对[/color]
template<typename U,int size>
void ebusort(string (&arr)[size])     
{
        string temp;
        for(int i=0;i<size;i++)
                for(int j=0;j<size-i;j++)
                        if(arr[j].compare(arr[j+1])>0)
                        {
                                temp=arr[j];
                                arr[j]=arr[j+1];
                                arr[j+1]=temp;
                        }
        for(int i=0;i<size;i++)
                cout<<arr<<"  ";
                cout<<endl;
}                              //[color=FF0000]想让这个模板特例对string数组排序,但是输入数据之后没有结果输出          [/color]
template <typename U,int size>
istream& operator>>( istream & in,U(&arr)[size])   //用模板函数重载输入运算符
{
   cout<<"请分别输入int,char,string型数组:";
   for(int i=0;i<size;i++)
                cin>>arr;
   return in;
}

void main()
{
        int a[10];
        char b[10];
        string c[10];
        cin>>(a);
        cin>>(b);
        cin>>(c);
        ebusort(a);
        ebusort(b);
        ebusort(c);
}

回复列表 (共5个回复)

沙发

模板特例的表示有问题

板凳

这位朋友,我看了你的程序并为你更正了部分。我不知道你用的是什么编译器。至少在VC6下此程序是通不过的。此程序漏洞百出,我的确不敢恭维。原因如下:
首先,排序算法错误,外层循环需要size-1而非size次。当然内层也得改。
其次,模板完全特化(针对string类型)用template<>。其实没有必要,上一个模板函数能解决string类型的排序。
最后,也是最关键的!如果我没有记错的话,模板函数应该无默认形参值(指的是模板头中的),只有类模板才允许。正是如此在VC下是通不过的。难道在其他编译器下能通过?抑或是我记错了?
还有,对输入输出操作符进行重载,一般有第二个参数是一个对象,对一般数组进行重载好象不符合常规!但肯定是可以的!
最最后的是这个程序根本就不能输入输出!!!!我想应该是笔误吧。希望认真一些。
我把修改后的代码贴上。但有个小问题,好像与编译器有关,我为了简便,略去了char类型!

3 楼

别忘了给分哟!
//用冒泡排序法编写一个从小到大排序的函数模板,要求可以用int ,double,char,string,char*等类型数据进行验证
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int size=0;
template<typename U>
void ebusort(U arr[],int size)     
{
        U temp;
         for(int i=0;i<size-1;i++)
            for(int j=0;j<size-1-i;j++)
                       if(arr[j]>arr[j+1])
                        {
                                temp=arr[j];
                                arr[j]=arr[j+1];
                                arr[j+1]=temp;
                        }
        
        for(i=0;i<size;i++)
            cout<<arr[i]<<"  ";
        cout<<endl;
}                              //这个排序模板可以用于int,double,char排序,但是数组的最后一个值输出得不对
       
template <class U>
istream& operator>>(istream &in,U *arr)   //用模板函数重载输入运算符
{
   cout<<"请分别输入int,char,string型数组:\n";
   for(int i=0;i<size;i++)
                in>>arr[i];
   return in;
}

void main()
{
        int a[10];
        //char b[10];
        string c[10];
        size=10;
        cin>>a;
        //cin>>b;
        cin>>c;
        ebusort(a,10);
        //ebusort(b,10);
        ebusort(c,10);
}

4 楼

模板函数可有默认形参值,VC6.0 就可以
不过最好使用cbuilder ,这个功能比较强大,对模板支持的比较好

5 楼

楼上几位说得对
改过来了
我用的是Visual C++2005 Express Edition

我来回复

您尚未登录,请登录后再回复。点此登录或注册