类模板,class template
template<typename T>
class complex
{
public:
complex (T r=0,T i=0)
: re(r) ,im(i)
{ }
complex& operator +=(const complex&);
T real () const { return re; }
T imag () const { return im; }
private:
T re,im;
friend complex& _doapl(complex*,const complex&);
};
{
complex<double> c1(2.5,1.5); //由用户指定类型
complex<int> c2(2,6);
...
}
函数模板,function template
template <class T>
inline
const T& min(const T& a,const T& b)
{
return b < a ? b:a;
}
stone r1(2,3),r2(3,3),r3;
r3=min(r1,r2);
编译器会对function template进行实参推导(argument deduction)
实参推导的结果,T为stone,于是调用stone::operator<
class stone
{
public:
stone(int w,int h,int we)
:_w(w),_h(h),_weight(we)
{ }
bool operator< (const stone& rhs) const
{ return _weight < rhs.weight; }
private:
int _w,_h,_weight;
};
namespace
using namespace std;
//..................................................
#include<iostream>
#include<memory>
namespace jj01
{
void test_member_template()
{ .... }
}
//..................................................
#include<iostream>
#include<list>
namespace jj02
{
template<typename T>
using Lst=list<T,allocator<T>>;
void test_template_param()
{ ...... }
}
//.................................................
int main(int argc,char** argv)
{
jj01::test_member_template();
jj02::test_template_template_param();
}