例如: //myHeader.h #include <iostream.h> template <class T> class A { public: A(); T &max(const T &,const T &) const; }; template <class T> T &A<T>::max(const T &a,const T &b) { return a<b?b:a; }
//main.cpp #include <iostream.h> #include “myHeader.h“
main() { A<int> *cls=new A<int>(); int a=100; int b=200; cout<<cls->max(a,b)<<endl; return 0; } 按照上面的格式就可以执行。如果把class A的函数max的实现从头文件中拿出来放在一个cpp文件中 ,则会产生错误,代码如下: //myHeader.h #include <iostream.h> template <class T> class A { public: A(); T &max(const T &,const T &) const; }; //classA.cpp #include “myHeader.h“ template <class T> T &A<T>::max(const T &a,const T &b) { return a<b?b:a; }
//main.cpp #include <iostream.h> #include “myHeader.h“
main() { A<int> *cls=new A<int>(); int a=100; int b=200; cout<<cls->max(a,b)<<endl; return 0; } 这时候就会出错,原因就是VC6不支持模板函数在cpp文件中的实现。解决的办法是把其实现放在头文件中, 不一定放在定义类的头文件中,可以放在独立的头文件中。 注意:其实根据实质,也可以把模板函数的实现放在cpp文件中,但是要把cpp文件包含在调用该模板函数的 文件中。 代码如下: //myHeader.h #include <iostream.h>
template <class T>class A { public: A(); const T& max(const T&,const T&); }; //classA.cpp #include <iostream.h> #include "myHeader.h" template <class T>const T &A<T>::max(const T &a,const T &b) { return a<b?b:a; } template <class T>A<T>::A() { cout<<"constructor!"<<sizeof(T)<<endl; } //main.cpp #include "myHeader.h" #include "classA.cpp" #include <iostream.h> main() { A<int> *cls=new A<int>(); int a=100; int b=100; A<double> *d=new A<double>(); double d1=100.2; double d2=200.2; cout<<cls->max(a,b)<<endl; cout<<d->max(d1,d2)<<endl; return 0; }

|