模板分为两种:
(1)函数模板
(2)类模板
(1)函数模板的注意事项
1)函数模板和普通函数重载的时候,使用默认参数调用,默认调用普通函数
2)如果显示声明模板参数,则使用函数模板调用
3)模板函数的函数参数如果传入对象是对象,那么需要对函数做具体化声明
4)当函数模板和普通函数同名,但是参数不同,能不强转调用的优先调用。
(2)类模板
1)类模板中成员函数的创建时机:函数在被调用的时候才被创建,普通类中的成员函数是一开始就被创建
2)类模板的调用需要显式调用,不能隐式调用
3)对于类模板的调用有3种方式:指定参数类型传入,参数模板传入,类模板传入
4)
#includeusing namespace std; template class person{ public: T1 age; T2 name; person(T1 age,T2 name) { this->age=age; this->name=name; } void fun() { cout< &p)//指定参数类型传入 { p.fun(); } template //参数模板化传入 void print_2(person &p) { p.fun(); cout<<"T1的类型:"< void print_3(T &p)//将整个类模板化传入 { p.fun(); cout<<"T的类型:"< person p(123,"八戒"); print_1(p); print_2(p); print_3(p); } int main() { test01(); }
类模板的继承和类外实现成员函数:
#includeusing namespace std; template class base { public: T age; }; template //在继承的时候如果父类是类模板,那么继承的时候需要对类模板传入参数列表,如果想要灵活运用,子类中也需要创建类模板 class son:public base { public: T1 age; son(T1); void show(T2); }; template son ::son(T1) { } template void son ::show(T2)//类外实现类模板成员函数 { cout<<"类模板成员函数"< son p(1); p.age=100; p.base::age=20; cout< 在对类模板分文件编写的时候报错解决方法
1)将类的声明和实现写到一起将文件命名为.hpp后缀的文件
2)直接包含.cpp源文件。
也就是说声明和实现不要分文件写最好类模板中友元函数的类外实现
1)声明类
2)实现友元函数
3)在定义的时候加<>#includeusing namespace std; template class person; //先声明类 template void show(person &p)//实现友元全局函数 { cout< class person { friend void show<>(person &p);//友元全局函数的定义 public: T age; }; int main() { person p; p.age=100; show(p); }



