例如:
//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;
}