Hopes

          Start Here..

           

          在類模板的聲明和定義中把.h與.cpp分離

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

          1.聲明部分
          // Tpl.h
          #pragma once

          template<class T>
          class CTpl  
          {
          public:
              CTpl();
              virtual ~CTpl();

              void Test(T t);

          };

          2.實現部分
          // Tpl.cpp
          #include "Tpl.h"

          template<class T>
          CTpl<T>::CTpl()
          {

          }

          template<class T>
          CTpl<T>::~CTpl()
          {

          }

          template<class T>
          void CTpl<T>::Test(T t)
          {

          }
          3.習慣錯誤用法
          // main.cpp
          #include "Tpl.h"

          int main()
          {
              CTpl<char> ts;
              ts.Test(3);
              return 0;
          }

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

          // main.cpp
          #include "tpl.cpp"
          int main()
          {
              CTpl<char> ts;
              ts.Test(3);
              return 0;
          }

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

          posted on 2013-09-07 22:42 ** 閱讀(203) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          統計

          公告

          你好!

          常用鏈接

          留言簿(2)

          隨筆檔案

          文章分類

          文章檔案

          新聞檔案

          相冊

          收藏夾

          C#學習

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 亳州市| 班戈县| 林芝县| 高密市| 建瓯市| 彩票| 东山县| 石渠县| 侯马市| 英山县| 子长县| 隆德县| 辽阳市| 于都县| 五常市| 铁岭市| 庄河市| 襄汾县| 阿拉尔市| 榆林市| 宜都市| 石楼县| 玛纳斯县| 和政县| 玉山县| 房山区| 宜君县| 开原市| 天门市| 柞水县| 阳城县| 广昌县| 旬邑县| 镇宁| 泰州市| 会昌县| 化州市| 永顺县| 河间市| 综艺| 云林县|