問題:類模板的成員函數是在調用時才被創建,導致分文件編寫時調用不到。
解決:
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文件中進行引用即可。