类模板中的成员函数,并不是一开始就创建,而是在模板调用时再生成
class person1
{
public:
void showperson1()
{
cout << "show person1" << endl;
}
};
class person2
{
public:
void showperson2()
{
cout << "show person2" << endl;
}
};
template<class T>
class myClass
{
public:
T obj;
void func1()
{
obj.showperson1();
}
void func2()
{
obj.showperson2();
}
};
int main()
{
myClass<person1>m;//指定为m中的成员变量obj为person1类
m.func1();
m.func2();//编写过程中编译器并不会报错,而在编译后,会报错,说明函数模板调用才会创建成员函数
return 0;
类模板实例化出的对象,向函数传参的方式
1、指定传入类型:直接显示对象数据类型(最常用,后面两种是类模板配合参数模板,较为复杂)
template<class T1,class T2>
class person
{
public:
person(T1 name, T2 age)
{
m_name = name;
m_age = age;
}
void showPerson()
{
cout << "姓名:" << m_name << "年龄:" << m_age << endl;
}
T1 m_name;
T2 m_age;
};
//指定传入类型
void printPerson1(person<string, int>&p)
{
p.showPerson();
}
void test01()
{
person<string, int>p1("孙悟空",12);
printPerson1(p1);
}
int main()
{
test01();
return 0;
}
运行结果:
2、参数模板化:
//参数模板化
template<class T1,class T2>//这行一定要加是为了说明下一行的T1,T2为模板中的参数
void printPerson2(person<T1, T2>&p1)
{
p.showPerson();
cout << "T1的类型为:" << typeid(T1).name() << endl;
cout << "T2的类型为:" << typeid(T2).name() << endl;
}
void test01()
{
person<string, int>p1("孙悟空",12);
printPerson2(p1);
}
3、整个类模板化:
//整个类模板化
template<class T>
void printPerson3(T &p)
{
p.showPerson();
cout << "T的类型为:" << typeid(T).name() << endl;
}
void test01()
{
person<string, int>p1("孙悟空",12);
printPerson3(p1);
}