问题:类模板的成员函数是在调用时才被创建,导致分文件编写时调用不到。
解决:
1.直接包含cpp文件
2.将声明和实现写到同一个文件中,并更该后缀名为.hpp,.hpp是约定的名字,并不是强制
第一种方式:
头文件:person.h
#include<iostream> using namespace std; template<class T1, class T2> class Person { public: Person(T1 name, T2 age); void show(); T1 name; T2 age; };
源文件:person.cpp
#include "person.h" template<class T1, class T2> Person<T1, T2>::Person(T1 name, T2 age) { this->name = name; this->age = age; } //对于成员函数,需要指明类的参数的代表 template<class T1, class T2> void Person<T1, T2>::show() { cout << this->name << endl; cout << this->age << endl; }
源文件:test.cpp
//第一种方式,直接包含源文件 #include "person.cpp" void test() { Person<string, int> p("tom", 12); p.show(); } int main() { test(); system("pause"); return 0; }
注意标红的地方,引入的是person.cpp,而不是person.h,因为类模板成员函数是在调用时才创建的,因此在编译阶段引入person.h是找不到声明的实现的。
第二种方式:
头文件:person.hpp
#include<iostream> using namespace std; template<class T1, class T2> class Person { public: Person(T1 name, T2 age); void show(); T1 name; T2 age; }; template<class T1, class T2> Person<T1, T2>::Person(T1 name, T2 age) { this->name = name; this->age = age; } //对于成员函数,需要指明类的参数的代表 template<class T1, class T2> void Person<T1, T2>::show() { cout << this->name << endl; cout << this->age << endl; }
源文件:test.cpp
//第二种方式,将.h和.cpp中的内容写到一起,将后缀名改为.hpp #include "person.hpp" void test() { Person<string, int> p("tom", 12); p.show(); } int main() { test(); system("pause"); return 0; }
将类模板的声明和实现都放在.hpp中,并在cpp文件中进行引用即可。