掌握类模板成员函数分文件编写时产生的问题以及解决方法。
问题:
类模板成员函数创建时机是调用阶段(调用时才会创建),导致分文件编写时链接不到。
解决:
方式一:直接包含.cpp源文件。
#include <iostream>
using namespace std;
template<class T1,class T2>
class Person{
public:
Person(T1 name,T2 age);
void showPerson();
T1 m_Name;
T2 m_Age;
};
template<class T1,class T2>
Person<T1,T2>::Person(T1 name,T2 age)
{
this->m_Name = name;
this->m_Age = age;
}
template<class T1,class T2>
void Person<T1,T2>::showPerson()
{
cout << "姓名:" << this->m_Name << endl;
cout << "年龄:" << this->m_Age << endl;
}
int main(int argc,char *argv[])
{
Person<string,int> p("Tom",18);
p.showPerson();
return 0;
}
1、创建person.h头文件。
2、将以下的内容,剪切到person.h中。
#include <iostream>
using namespace std;
template<class T1,class T2>
class Person{
public:
Person(T1 name,T2 age);
void showPerson();
T1 m_Name;
T2 m_Age;
};
3、创建person.cpp源文件。4、将以下的内容,剪切到person.cpp中。
template<class T1,class T2>
Person<T1,T2>::Person(T1 name,T2 age)
{
this->m_Name = name;
this->m_Age = age;
}
template<class T1,class T2>
void Person<T1,T2>::showPerson()
{
cout << "姓名:" << this->m_Name << endl;
cout << "年龄:" << this->m_Age << endl;
}
5、在main.cpp中包含#include "person.h"
6、在person.cpp中包含#include "person.h"
编译出错。
编译器只看得到函数声明,并不知道函数实现过程,所以报错
解决办法:
将main.cpp中的#include "person.h"
修改为 #include "person.cpp"
方式二:将声明和实现写到同一个文件中,并更改后缀名为.hpp(.h+.cpp),.hpp是约定的名称,并不是强制的。
1、创建person.hpp。
2、将以下的内容,拷贝到hpp文件。
#include <iostream>
using namespace std;
template<class T1,class T2>
class Person{
public:
Person(T1 name,T2 age);
void showPerson();
T1 m_Name;
T2 m_Age;
};
template<class T1,class T2>
Person<T1,T2>::Person(T1 name,T2 age)
{
this->m_Name = name;
this->m_Age = age;
}
template<class T1,class T2>
void Person<T1,T2>::showPerson()
{
cout << "姓名:" << this->m_Name << endl;
cout << "年龄:" << this->m_Age << endl;
}
3、只需要在main.cpp中包含#include "person.hpp"