类模板中成员函数和普通类中的成员函数创建的时机是有区别的:
普通类中的成员函数一开始就可以创建。
类模板中的成员函数在调用时才创建。
#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;
class Person1
{
public:
void showPerson_1()
{
cout << "show Person_1" << endl;
}
};
class Person2
{
public:
void showPerson_2()
{
cout << "show Person_2" << endl;
}
};
template<typename T>
class MyClass
{
public:
T obj;
// 类模板中的成员函数在调用时才创建
void func1()
{
obj.showPerson_1();
}
void func2()
{
obj.showPerson_2();
}
};
int main(void)
{
system("pause");
return 0;
}
上述代码,定义了两个普通类Person1和Person2,成员函数分别为showPerson_1()、showPerson_2();在模板类MyClass中,obj定义为通用类型T的对象。分别在函数func1和func2中调用showPerson_1()函数和showPerson_2()函数。
虽然函数showPerson_1()和showPerson_2()不是同一个类的成员函数,但是都可以通过obj调用,并且编译时并没有报错。
代码能够通过编译的原因在于:类模板的成员函数在调用时才创建。在类模板的声明阶段,编译器无法确定T的数据类型,T中的成员函数更无从得知,只有在调用阶段,显示指定T的数据类型之后,成员函数才会创建。