分文件解决
- .h .cpp分别写声明和实现
- 但是由于 类模板的成员函数运行阶段才去创建,导致包含.h头文件,不会创建函数的实现,无法解析外部命令
- 解决方案 保护 .cpp文件 (不推荐)
- 不要进行分文件编写,写到同一个文件中,进行声明和实现,后缀名改为.hpp
- 约定俗成的 (.hpp文件即分文件模板文件)
头文件
Person.h
#pragma once #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; };
Person.cpp
#include "Person.h" 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; }
main
#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; #include "Person.h" void test01() { Person<string, int>p("猪八戒", 30); //error 无法解析的外部命令 p.showPerson(); //error } int main() { test01(); system("Pause"); return 0; }
无法运行:
解决办法:
main中引入.cpp文件
结果:
建议
模板不要分文件编写,写到一个类中即可,类内进行声明和实现,最后把后缀名改为.hpp 约定俗成
把Person.cpp的内容放入Person.h中 并把Person.h改后缀为 Person.hpp
#pragma once #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 << " 年龄: " << this->m_Age << endl; }
结果: