废话不多说,先贴代码
#ifndef LIST_H
#define LIST_H
#include <iostream>
using namespace std;
template <class type>
class list
{
friend list operator+(const list &a,const list &b);
private:
type *data;
int maxsize;
int size;
void doublespace(){
maxsize*=2;
type*t=new type[maxsize];
for(int i=0;i<size;++i)
t[i]=data[i];
data=t;
}
public:
list(int insize=10){
data=new type[insize];
maxsize=insize;
size=0;
}
virtual ~list(){size=0;delete[]data;}
void clear(){
size=0;
}
void traversal(){
for(int i=0;i<size;++i)
cout<<data[i]<<" ";
cout<<endl;
}
int length(){return size;}
type visit(int i){
if(i<=size)
return data[i];
else
cout<<"void input"<<endl;
}
void remove(int i){
for(int j=i;j<size;++j)
data[j]=data[j+1];
--size;
}
void insert(int i,type x)
{
if(size==maxsize)
doublespace();
for(int j=size-1;j>=i;--j)
{
data[j+1]=data[j];
}
data[i]=x;
++size;
}
};
template <class type>
list<type> operator+(const list<type> &a,const list<type> &b)
{
list<type> c(a.size+b.size);
int i,j;
for( i=0;i<a.size;++i)
{
c.data[i]=a.data[i];
}
for(j=i;j<c.size;++j)
{
c.data[j]=b.data[j-i];
}
return c;
}
#endif // LIST_H
这里我想在list模板类中进行一个+运算符重载,可是如果这样写,编译的时候会报错,如下,
[Warning] friend declaration ‘list operator+(const list&, const list&)’ declares a non-template function [-Wnon-template-friend]
去网上查了一些资料找到了两种解决方法:
方法一: 将运算符重载函数在类内部实现,而不是在外部实现,代码如下,
#ifndef LIST_H
#define LIST_H
#include <iostream>
using namespace std;
template <class type>
class list
{
//方法一
friend list<type> operator+(const list<type> &a,const list<type> &b){
list c(a.size+b.size);
int i,j;
for( i=0;i<a.size;++i){
c.data[i]=a.data[i];
}
for(j=i;j<c.size;++j){
c.data[j]=b.data[j-i];
}
return c;
}
private:
type *data;
int maxsize;
int size;
void doublespace()
{
maxsize*=2;
type*t=new type[maxsize];
for(int i=0;i<size;++i)
{
t[i]=data[i];
}
data=t;
}
public:
list(int insize=10)
{
data=new type[insize];
maxsize=insize;
size=0;
}
virtual ~list(){size=0;delete[]data;}
void clear()
{
size=0;
}
void traversal()
{
for(int i=0;i<size;++i)
{
cout<<data[i]<<" ";
}
cout<<endl;
}
int length(){return size;}
type visit(int i)
{
if(i<=size)
return data[i];
else
cout<<"void input"<<endl;
}
void remove(int i)
{
for(int j=i;j<size;++j)
data[j]=data[j+1];
--size;
}
void insert(int i,type x)
{
if(size==maxsize)
doublespace();
for(int j=size-1;j>=i;--j)
{
data[j+1]=data[j];
}
data[i]=x;
++size;
}
};
#endif // LIST_H
方法二:在友元函数声明前定义一个和 type不同的模板参数U,代码如下,
#ifndef LIST_H
#define LIST_H
#include <iostream>
using namespace std;
template <typename type>
class list
{
//方法二
template <typename U>
friend
list<U> operator+(const list<U> &a,const list<U> &b);
private:
type *data;
int maxsize;
int size;
void doublespace()
{
maxsize*=2;
type*t=new type[maxsize];
for(int i=0;i<size;++i)
{
t[i]=data[i];
}
data=t;
}
public:
list(int insize=10)
{
data=new type[insize];
maxsize=insize;
size=0;
}
virtual ~list(){size=0;delete[]data;}
void clear()
{
size=0;
}
void traversal()
{
for(int i=0;i<size;++i)
{
cout<<data[i]<<" ";
}
cout<<endl;
}
int length(){return size;}
type visit(int i)
{
if(i<=size)
return data[i];
else
cout<<"void input"<<endl;
}
void remove(int i)
{
for(int j=i;j<size;++j)
data[j]=data[j+1];
--size;
}
void insert(int i,type x)
{
if(size==maxsize)
doublespace();
for(int j=size-1;j>=i;--j)
{
data[j+1]=data[j];
}
data[i]=x;
++size;
}
};
template <typename type>
list<type> operator+(const list<type> &a,const list<type> &b)
{
list<type> c(a.size+b.size);
int i,j;
for( i=0;i<c.size;++i)
{
c.data[i]=a.data[i];
}
for(j=i;j<c.size;++j)
{
c.data[j]=b.data[j-i];
}
return c;
}
#endif // LIST_H
目前,这两种方法是比较好用的。