函数模板注意事项:
1、自动类型推导必须得出一直数据类型才可
2、模板必须要确定出T的数据类型,才可以使用
类模板注意事项:
1、类模板没有自动推导使用方式
2、类模板在模板参数列表中可以有默认参数
template<class nameType,class ageType=int>
类模板成员函数类外实现
template<class T1,class T2 >
class Person
{
public:
Person(T1 name, T2 age);
//{
// this->m_age = age;
// this->m_name = name;
//}
void showPerson();
//{
// cout << m_age << m_name << endl;
//}
T1 m_name;
T2 m_age;
};
//构造函数的类外实现
template<class T1,class T2>
Person<T1,T2>::Person(T1 name, T2 age)
{
this->m_age = age;
this->m_name = name;
}
三种方式将类模板作为参数传入函数
1.指定传入得类型--直接显示对象得数据类型
template<class T1,class T2>
class Person
{
public:
Person(T1 name,T2 age)
{
this->m_name = name;
this->m_age = age;
}
void showPerson()
{
cout << m_name << " " << m_age;
}
T1 m_name;
T2 m_age;
};
三种传入方式
void PrintPerson1(Person<string, int>& p)
{
p.showPerson();
}
void test01()
{
Person<string, int>p1("snajhdaj", 10000);
PrintPerson1(p1);
}
2、参数模板化-----将对象得参数变为模板进行传递
template<class T1,class T2>
void printPerson2(Person<T1,T2>&p)
{
p.showPerson();
cout << endl;
cout << "T1得类型是:" << typeid(T1).name() << endl;//可以知道编译器=推出来得类型
cout << "T2得类型是:" << typeid(T2).name() << endl;
}
void test02()
{
Person<string, int>p2("猪八戒", 10008);
printPerson2(p2);
}
3、整个类模板化---将这个对象类型模板化进行传递
template<class T >
void printPerson(T &p)
{
p.showPerson();
cout << "T的数据类型" << typeid(T).name()<<endl;
}
void test03()
{
Person<string, int>p3("唐僧", 30);
printPerson(p3);
}