类模板对象作函数参数时,函数的形参有3中写法。
1.类模板如下:
#include<iostream>
#include<string>
using namespace std;
template<class T1,class T2>
class Person {
public:
Person(T1 name, T2 age) {
this->name = name;
this->age = age;
}
void showPerson() {
cout << "name=" << name << " ,age=" << age << endl;
}
T1 name;
T2 age;
};
2.函数形参写明指定参数类型。在本例中,printPerson1的形参中,尖括号内必须写出类模板中参数的类型
//1.指定传入类型
void printPerson1(Person<string, int> *p) {
p->showPerson();
}
void test01() {
Person<string, int> p("小则又沐风", 100);
printPerson1(&p);
}
int main() {
test01();
//test02();
//test03();
return 0;
}
3.运行结果:
4.类型模板化。printPerson2的形参中,尖括号内写T1,T2。但是使用T1,T2必须在方法的上方补充,template<class T1, class T2>。 使用typeid().name()方法可以输出T1,T2 的类型
//2.参数模板化 template<class T1,class T2> void printPerson2(Person<T1, T2>& p) { p.showPerson(); cout << "T1的类型:" << typeid(T1).name() << endl; cout << "T2的类型:" << typeid(T2).name() << endl; } void test02() { Person<string, int> p("蜻蜓", 90); printPerson2(p); } int main() { //test01(); test02(); //test03(); return 0; }
5.运行结果
![]()
6.整个类参数模板化
//3.整个类模板化 template<class T> void printPerson3(T &p) { p.showPerson(); cout << "T的数据类型是:" << typeid(T).name() << endl; } void test03() { Person<string, int> p("堂太深", 30); printPerson3(p); } int main() { //test01(); //test02(); test03(); return 0; }
7.运行结果: