模板類的定義和實現

看了幾位大嚇的回復,深深地感覺到了這篇附筆中可能存在錯誤,於是把最初遇到此問題時的環境再模擬了一下,現在可以確認這篇附筆中的確存在問題,現在就修正一下,並對各位表示歉意.6月初的一個項目中需要寫一個高性能網路服務端程序,在網上找到了一份很好的代碼(請參見),在使用過程中發現在多個cpp文件中引入這份代碼的h文件時,會出現很多重複定義錯誤,當時很頭疼,沒能很好的解決問題.現總結一條:在使用類模板技術時,可在.h中實現,也可在.h和.cpp中分開實現,若用.h實現,不要在文件中加入非類模板代碼,可避免重寫定義錯誤..2009年7月25日23時58分58秒//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 原文如下:Posted on 2009-07-25 15:10 sToa//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1.聲明部分

//Tpl.h

#pragmaonce

template<classT>

classCTpl

{

public:

CTpl();

virtual~CTpl();

voidTest(Tt);

};

2.實現部分

//Tpl.cpp

#include"Tpl.h"

template<classT>

CTpl<T>::CTpl()

{

}

template<classT>

CTpl<T>::~CTpl()

{

}

template<classT>

voidCTpl<T>::Test(Tt)

{

}3.習慣錯誤用法

//main.cpp

#include"Tpl.h"

intmain()

{

CTpl<char>ts;

ts.Test(3);

return0;

}

build時出現link錯誤main.obj : error LNK2001: unresolved external symbol "public:virtual __thiscallCTpl<char>::~CTpl<char>(void)"(??1?$CTpl@D@@UAE@XZ)main.obj : error LNK2001: unresolved external symbol "public: void__thiscall CTpl<char>::Test(char)"(?Test@?$CTpl@D@@QAEXD@Z)main.obj : error LNK2001: unresolved external symbol "public:__thiscallCTpl<char>::CTpl<char>(void)"(??0?$CTpl@D@@QAE@XZ)這組錯誤信息和project中不加入Tpl.cpp的錯誤信息一樣,即沒有CTpl<char>的實現代碼我們把Tpl.cpp包涵到main.cpp中,問題解決4.正確用法

//main.cpp

#include"tpl.cpp"

intmain()

{

CTpl<char>ts;

ts.Test(3);

return0;

}

5.總結1.在使用以.h,.cpp分離實現模板類時,不能像使用普通類一樣只簡單的包涵.h頭文件,應該在使用模板類的cpp文件中引入模板類相應的cpp文件2.將模板類的聲明與實現都放在.h中(在多個cpp中使用不同模板參數時可能會引起重複定義的編譯錯誤)


推薦閱讀:

XMind模板那裡可以下載?
【代碼應用】用代碼製作詩詞模板
【放射微學堂】骨關節病變-X線診斷影像報告模板
四六級考前六天作文模板萬能句型大全
有哪些 Jekyll 模板值得推薦?

TAG:定義 | 模板 | 實現 |