学习目标:
*掌握模版成员函数分文件编写产生的问题以及解决方式
问题:
*类模版中成员函数创建时机是在调用阶段,导致分文件编写时连接不到
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 << "年龄: " << this->m_Age << endl;
}
void test01()
{
Person<string, int>p("Jerry", 18);
p.showPerson();
}
正常得的,我们会将函数声明放在.h,将实现放在.pp 如果我们将函数模版也这样操作,编译器不会报错,但是运行调用模版时会出现找不到链接的错误.
原因:这是因为类模版中的成员函数在调用时才创建,因此当你包含.h时,编译器进入后看到.h的代码后,不会生在你运行的.cpp成函数,然后对于调用的.cpp中的那些模版的函数,编译器也没介绍过,因此编译器不会去找这些函数也不会创建.
总结:类模版的成员函数一开始是不创建的,所以导致导致编译器看不到.cpp的代码
解决方法一:(较少使用)
//第一解决方式,直接包含源文件
#include"person.cpp"
将包含.h改成.cpp,在调用.cpp时会进入cpp所包含的.h
解决方法二:(常用)
//第二种解决方式,将.h和.cpp中的内容写到一起,将后缀名改为.hpp文件
#include"person.hpp"//不是必须后缀名,但是约定俗称
将.h和.cpp的东西写在同一个文件里,后缀名改为.hpp,后人看到.hpp为后缀时会默认这是模版文件
.hpp不是强制的,但是是约定俗成
仅个人看视频笔记与理解,如有误可指出谢谢