2009-01-06

C++编程基础~关于函数模板与其实现

模板在编译过程中要根据类型的不同生成不同的函数实现,如果编译器不知道用哪种类型生成这种模板的实现,则会报模板没有实现的错误。

这样讲可能比较难理解,下面看一个例子:
定义一个求最小值的模板函数,其声明在min.h文件中:

template<class T> T min(T x,T y);

然后在min.cpp文件中写入模板实现的算法:

template<class T>T min(T x,T y)
{ return x<y ? x : y;}

在main.cpp中包含了头文件min.h,并且用到了这个函数模板的float实例:

a = min(3.5, 4.4);

然后连接的时候将min.o和main.o一起连接为可执行文件,这时候编译器会报错,因为template没有实现,如果在min.cpp文件中添加这样一行则能够正常编译:

template double min (double,double);

模板的机制是虽然方便了编程者,但是对于编译器而言,你用到了哪种数据类型的模板,编译器还需要生成哪种类型的模板实现。在上述例子中。min.cpp文件中相当于定义了模板函数的算法规则,但是编译器在编译的时候并没有生成任何的关于函数实现的代码,因为它不知道该生成什么类型的实现,而在main.cpp中虽然知道该用到模板的double实现,但编译器不知道怎么去实现,因为实现部分代码在min.cpp中。如果在min.cpp中添加了那一行,则在编译min.o的时候编译器即将double类型的模板实现编译到了min.o中,与main.o连接便不会再出问题。

所以stl库中所有的函数(类)模板实现均以内联函数的方式写在了.h中,这样每次在引用这些模板声明时实际上也包含了这些模板的实现代码,在程序中调用这些模板的实例时便能够正确生成其相应的实现。

___
Sent with SnapperMail
www.snappermail.com

没有评论: