请问这个C++程序需要怎么修改 出错的地方我是想用函数重载

#include<iostream>using namespace std;
struct array
{
char ch;
int re;
};

template <class T >int arraydelete( T *a, int k, int n)//删除第k个元素;
{

while(k<n)
{
a[k]=a[k+1];
k++;
}
return n--;

}template <class T >
void arrayInsert (T *a, int k,T x, int n)//在k处插入一个数。
{
T t=a[k];
a[k]=x;
while(n>k)
{
a[n+1]=a[n];
if(n==k+1)a[n]=t;
n--;
}

}

int compinch(const int a,const int b){
if(a==b)return 0;
return -1;

}int compinch(const char a,const char b)
{
if(a==b)return 0;
return -1;

}template <class T >
int arrayfind(T* a, int n,T ez,int (*fcmp)(const int,const int))//查找
{
int i;
for(i=0;i<n; i++)
if(fcmp(a[i], e) == 0)return i;
return -1;

}template <class T >
int arrayfind(T* a, int n,T e,int (*fcmp)(const char,const char))//查找
{
int i;
for(i=0;i<n; i++)
if(fcmp(a[i], e) == 0)return i;
return -1;

}
int main()
{
int a[20]={1,2,3,4,5,6,7,8,9};
struct array b[20]={'a',1,'b',2,'c',3,'d',4,'e',5,'f',6,'h',7,'i',8,'j',9};
char s[20]="abcdEfghij";
int i,n,k;
//删除
cout<<"The original array: ";
for(i=0;i<9;i++)
cout<<a[i];
cout<<endl;
cout<<"Iput the index you want to delete:";
cin>>n;
k=arraydelete(a,n,8);
for(i=0;i<k;i++)
cout<<a[i];
cout<<endl;

cout<<"The original array: "; cout<<s;
cout<<endl;
cout<<"Input the index of which you want to delete:";
cin>>n;
k=arraydelete(s,n,strlen(s));
for(i=0;i<k;i++)
cout<<s[i];
cout<<endl;

cout<<"The original array: "<<endl; for(i=0;i<9;i++)
cout<<b[i].re<<" "<<b[i].ch<<endl;
cout<<"Input the index of which you want to delete:";
cin>>n;
k=arraydelete(b,n,8);
for(i=0;i<k;i++)
cout<<b[i].re<<" "<<b[i].ch<<endl;

//插入
cout<<"After insert 6 "<<endl;
arrayInsert(a,n,6,k);
for(i=0;i<9;i++)
cout<<a[i];
cout<<endl;

cout<<"After insert Q "<<endl; arrayInsert(s,n,'Q',strlen(s));
cout<<s<<endl;

struct array ins={'C',0}; cout<<"After insert 0 C"<<endl;
arrayInsert(b,n,ins,k);
for(i=0;i<9;i++)
cout<<b[i].re<<" "<<b[i].ch<<endl;

// 查找
int j;
cout<<"******SEEK******"<<endl;
j=arrayfind(a,8,3,compinch);
if(j!=-1)cout<<"Index:"<<j<<endl;
else cout<<"Not found"<<endl;

j=arrayfind(s,strlen(s),'E',compinch); if(j!=-1)cout<<"Index:"<<j<<endl;
else cout<<"Not found"<<endl;
return 0;

}

先占位置,在帮你看吧
下面的这个函数参数的ez改为e,写错了吧
int arrayfind(T* a, int n,T ez,int (*fcmp)(const int,const int))//查找
{
int i;
for(i=0;i<n; i++)
if(fcmp(a[i], e) == 0)return i;
return -1;

}template <class T >

另外,你写的两个查找的模板还有两个比较相当的函数的名字都一模一样,如下执行这句时
j=arrayfind(a,8,3,compinch);
会发生两个重载,重载歧义,如你两个模板的T都变成int,你会发现,你不知道要调用哪一个模板了,记住compinch这函数做实参没有参数,不能区分是调用了哪个函数。
所以你应该把compinch这两个函数的其中一个改下名字就可以
或者其中一个模板改名字追问

谢谢 还有
template
int arrayfind(T* a, int n,T e,int (*fcmp)(const int,const int))//查找
{
。。。。
}template
int arrayfind(T* a, int n,T e,int (*fcmp)(const char,const char))//查找
{
‘’‘’‘’‘’
}
这四个函数重复率很高 能不能把他们合并呢?怎么合并呢?

追答

模板可以合并,但你个比较函数不能,每个不同的类型的比较函数是不同的
模板如下,函数指针的参数用类型T来定义,就可以了
template
int arrayfind(T* a, int n,T e,int (*fcmp)(const T,const T))//查找
{
。。。。
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-03-31
没明白你的意思。
函数重载本身是没有问题的。

没有函数重载,

直接双击ABS(双号)

{

回报率(数);

}

行了吗?

像你这种情况,必须按照顺序输入数据类型。

number1的输入真实的数据,就会发生错误。

------------------------------------
另:不引入数学函数库,可以被重载的ABS无关。

请问这个C++程序需要怎么修改 出错的地方我是想用函数重载
先占位置,在帮你看吧 下面的这个函数参数的ez改为e,写错了吧 int arrayfind(T* a, int n,T ez,int (*fcmp)(const int,const int))\/\/查找 { int i;for(i=0;i<n; i++)if(fcmp(a[i], e) == 0)return i;return -1;}template <class T > 另外,你写的两个查找的模板还...

C++ “表达式必须包含整数或枚举类型”错误,应该如何修改?
你的^操作符使用错了,^操作符在C\/C++里面是按位异或的意思,所以a^b的话,a和b都需要时整数才行,你的是double肯定不行了。不过我想你是想计算平方,C里面指数运算需要调用函数pow。拓展:1、C++这个词在中国大陆的程序员圈子中通常被读做“C加加”,而西方的程序员通常读做“C plus plus”,...

哪位高手帮我看下这个C++程序哪里出错了,是重载运算符的
s0 = s1 + s2; \/\/“s1+s2”处,将调用“operator +”函数 cout<<"s0=s1+s2=";s0.display();s4=s1^s2; \/\/“s1^s2”处,将调用“operator ^”函数 cout<<"s1^s2=";\/\/多了一个<符号,且这个值是一个距离,不需要用坐标表示,LZ改改吧,如果还需要什么可以联系我 s4.display();sy...

C++ 运算符的重载问题:什么时候operator()括号里面需要用&和const?不...
const double t是你自己定义的,没问题。表明t在函数内不被修改。如果要写拷贝构造函数,那么必须使用引用,A(const A & a)因为传参的过程就是调用拷贝构造的过程,而拷贝构造就是要定义的。

c++分数计算器程序设计 帮忙看一下这个程序应该怎么改进,为什么无法_百...
c++分数计算器程序设计帮忙看一下这个程序应该怎么改进,为什么无法运行,显示打开input.txt失败呢#include<iostream>#include<fstream>#include<cmath>usingnamespacestd;\/\/---... c++分数计算器程序设计帮忙看一下这个程序应该怎么改进,为什么无法运行,显示打开input.txt失败呢#include<iostream>#include<fstream>#include...

在C++中怎么搞清楚函数重载,函数重构以及运算符重载这些概念呢??我现 ...
函数重载就相当于汉语中的一词多意。根据参数的数目和类型做不同的调用。比如要做一个加法的程序,函数名都为add,但是我要做集中加法,1.整形的加法,完成两个整数的相加,返回和 int add(int,int)2.浮点数的加法,完成两个浮点数的相加,返回浮点和 float add(float,float)3.字符串的...

C++中函数重载有什么用?
类的构造函数跟类名相同,即构造函数都同名。如果没有函数重载机制,要想实例化不同的对象非常麻烦。操作符重载,本质上就是函数重载,它大大丰富了已有操作符的含义,方便使用,例如“+”可用于连接字符串等。重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数...

c++编程题 编写一个三维向量类,要求用友元函数重载“+”
我看了一下你首先是对操作符重载还不是很理解,其次,你还不知道在C++中有初始化列表这个玩意儿,下面分别给你讲解下3.怎样实现操作符重载:要实现操作符重载就要使用操作符重载函数,操作符重载函数用关见字operator实现,其形式为:反回类型operator操作符(参数列表){}。操作符重载函数是一个函数,只不过这个函数的函数...

C++的文件读写,为什么这个程序运行有时候对,有时候又会出错?
正确的做法可以通过两种方式来处理:1、 通过重载流输出\/输入流 ostream& operator << (ostream& os, People& p) { \/\/ people 转换成公有成员, 或在类中friend 该函数 os << p.people.name << p.people.weight ; \/\/ ... 按需输出成员 return os;} 读取通过重载流输入 istream& operator...

C++ 重载函数出错
class Book_item { public:string name;int price;int sold;double percent;public:friend istream& operator>>(istream&,const Book_item&); \/\/少了const,定义要与声明一致 friend ostream& operator<<(ostream& ,const Book_item&);\/\/少了const,定义要与声明一致 friend int operator+(int ...

相似回答
大家正在搜