在编写类模板的程序时,把类模板的成员函数的声明和实现分别写在了头文件和源文件中,导致了
出现编译出错的现象,现弄清楚了原因,特写此篇,供大家参考学习。
c++中每一个对象所占用的空间大小,是在编译的时候就确定的,在模板类没有真正的被使用之前,
编译器是无法知道模板类中使用模板类型的对象所占用的空间大小的。只有模板被真正使用的时候,
编译器才知道,模板套用的是什么类型,应该分配多少空间。这也是模板类称之为模板而不是泛型的原因。
既然是在编译的时候,根据套用的不同类型进行编译,那么,套用不同类型的模板类实际上就是两个不同的
类型,也就是说,vector
函数,只不过具有相似的功能。
因而模板类在套用不同类型之后,会被编译出不同代码。
所以模板类的实现,脱离具体的使用,是无法单独的编译的;也就是说把声明和实现分开的做法是不可取的,
必须把实现全部写在头文件里面。为了代码清晰,可以把实现写在类的外面。
下面是具体的代码实现:
以简单的冒泡排序为例写的类模板.h头文件如下:
template
class SortClass{
public:
//冒泡排序初级版:两两比较相邻记录的关键字
void BubbleSort0(T data[], int n)
{
for(int i=0;idata[j])
{
swap(data[i],data[j]);
}
}
}
}
private:
void swap(T &a, T &b)
{
T temp;
temp = a;
a=b;
b=temp;
}
};
这种写法是把类模板的成员函数实现写在了类里。
还可以把类模板的成员函数实现写在类外。代码如下:
template
class SortClass{
public:
void BubbleSort0(T data[], int n);
private:
void swap(T &a, T &b)
{
T temp;
temp = a;
a=b;
b=temp;
}
};
//这个类模板的成员函数实现
template
void SortClass::BubbleSort0(T data[], int n)
{
for(int i=0;idata[j])
{
swap(data[i],data[j]);
}
}
}
}
下面是对类模板的成员函数的调用c++代码:
#include
#include"sortImple.h"
using namespace std;
int main()
{
SortClass s;
int a[10]={9,4,2,7,3,1,5,8,6,0};
cout<<"排序前数组的元素值"<
程序输出如下: