一:
一般情況下,c++編寫**時,類的宣告和實現是由2個檔案分開來寫的。
".h"放的是類的宣告,「.cpp」放的是類的實現,然後使用該類的時候,就把該類對應的「 .h 」引用上就ok的了。
但是在類模板中這樣就不行。
(1)如下:
person.h的這個檔案放person類的宣告
#include
#include
using namespace std;
template
class person
public:
person(t1 name,t2 age);
void showperson();
t1 m_name;
t2 m_age;
person.cpp這個就編寫person類的實現。**如下:
#include "person.h"
template
person::person(t1 name,t2 age)
m_name=name;
m_age=age;
template
void person::showperson()
cout<
也就是main.cpp的內容即下:
#include "person.h"
int main()
personp("zhou",20); // ①
p.showperson(); //②
return ;
然後使用g++編譯,g++ main.cpp -o main
這個時候鏈結就會報錯的,在上面**的① 和②這兩個地方會報錯。
(2)為啥鏈結會報錯的呢?
因為c++進行的是單元編譯,在main.cpp裡面對 p.showperson()編譯鏈結時,對 #include "person.h" 這個檔案查詢,p.showperson 屬於類模板的成員方法,不會生成這樣的**,類模板的成員方法一開始不會建立,因為型別 不確定。
person.cpp雖然有實現的函式,但是成員函式並不會生成,導致鏈結的時候也不會找到的
所以類模板不建議分檔案來編寫。
總結:由於類模板的成員函式執行階段才去建立,導致包含.h標頭檔案,不會建立函式的實現,無法解析外部命令。
但上面main.cpp的有個簡單的更改方法。
#include "person.cpp"
int main()
personp("zhou",20); // ①
p.showperson(); //②
return ;
也就是把#include "person.h"改成 #include "person.cpp",但是不建議寫成這樣。
二:類模板一般就把宣告和實現寫進同乙個檔案,並把檔名改成「 .hpp 」,當我們看到這個字尾的時候,我們就這個檔案是個模板類。
上面的例子person類,合進乙個檔案如下:
#include
#include
using namespace std;
template
class person
public:
person(t1 name,t2 age);
void showperson();
t1 m_name;
t2 m_age;
template
person::person(t1 name,t2 age)
m_name=name;
m_age=age;
template
void person::showperson()
cout<
接著在main.cpp的檔案更改如下:
#include "person.hpp"
int main()
personp("zhou",20); // ①
p.showperson(); //②
return ;
然後g++ main.cpp -o main,這樣就可以編譯通過的了。如下圖,就是執行的結果:
C 類模板的宣告和實現不能分離
也許你具有良好的程式設計習慣,在定義乙個類的時候總會把宣告和實現分離開,位於不同的檔案中。比如你定義乙個類a,首先建立乙個.h檔案,如下 class a 接下來你建立乙個.cpp檔案實現類的宣告,如下 include classa.h include a a int b void a show a ...
C 模板類宣告和實現遇到的問題
宣告乙個 模板類的標頭檔案 stack.h include include templateclass stack 另外宣告乙個模板類的實現檔案 stack.cpp include stack.h templatevoid stack push t const elem templatevoid s...
C 模板類的宣告
c 的模板類感覺跟c 的泛型非常相似,自己寫了個例子試試,結果一大堆錯誤,後來慢慢除錯,發現模板類的宣告和定義不能分開 必須在同乙個檔案中 否則在使用模板類的會報乙個錯誤 無法解析的外部符號.該符號在函式 main 中被引用 然後把函式的定義全部挪到類的宣告裡面去後,就可以了通過了。看了好多人的例子...