1. 程式人生 > >C++模板的正確寫法

C++模板的正確寫法

我們寫模板傳統的寫法是這個樣子的:

                            1.   把類的整個框架寫在 .h 檔案中。//注意此檔案中要寫上 標頭檔案保護符

                            2.   把類中所有介面的實現寫在 .cpp 中。

                            3.   在 main() 中建立 女朋友 ,呼叫女朋友的各種介面。

            比如我自身寫的這個模板,運用傳統方式寫下來如下:

                

          為什麼要這樣寫呢, 因為分開寫的話,客戶獲取介面,卻不會知道具體的實現,是閉源來財的好路字和安全的需要。

               我照做了,結果編譯器正常運轉,而聯結器會報錯如下:  

                                    main.cpp:(.text+0x10): undefined reference to `BBtree<int>::insert()'

                                    main.cpp:(.text+0x1c): undefined reference to `BBtree<int>::maketree()'

這句報錯的意思是:在 .h 檔案中找不到此介面的實現

所以我們得出一個結論:

對於c++模板,傳統方法是不適用的!!!

            那怎麼辦?等死?等死是不可能的,這輩子都不可能等死。

            有以下三種方法解決這個問題:

            1. 把模板的定義與宣告全部寫在 .h 中 //這樣做的缺點是編譯檔案會變得很大,顯然要降低編譯和連結速度

            2. 顯式的例項化型別

            3. 運用 export 關鍵字 //在c11標準中已經被除名了,改用 extren 關鍵字防止阻止編譯器在某編譯單元內例項化特定模板

        第三種因為已經被除名,故不講。第二種不推薦使用,因為如果一開始就把模板全部都例項化,編寫模板就會失去意義。

        所以我們得出一個結論:

                                             ~~~~~~~~選第一種選第一種~~~~~~~

                        ps:c++的類模板大多數都是開源的,所有就不要想著分開寫了,非要分,推薦《強迫症康復指南》或者用第三種方法,但已經被c++11拋棄了

                   得出結論後,我們可以分析原因了(分析原因需要幾個知識點分別是 連結, 模板例項化等,在我其他的博文中都有所解釋)。。。未完待續

相關推薦

C語言中,"int* a, b, c;" 是正確寫法嗎?

有以下的C語言程式碼 int* a, b, c; int *a, *b, *c; int *a, b, c; 其中哪些語句是等價的? 哪些語句又是指標的正確寫法? 對於這些問題,相信一開始學習指

C++模板正確寫法

我們寫模板傳統的寫法是這個樣子的:                            1.   把類的整個框架寫在 .h 檔案中。//注意此檔案中要寫上 標頭檔案保護符                            2.   把類中所有介面的實現寫在 .cpp 中

Objective-c單例模式的正確寫法

                單例模式在iOS開發中可能算是最常用的模式之一了,但是由於oc本身的語言特性,想要寫一個正確的單例模式相對來說比較麻煩,這裡我就拋磚引玉來聊一聊iOS中單例模式的設計思路。關於單例模式更多的介紹請參考這篇文章。單例顧名思義就是說一個類的例項只能有一個,在java、C++這類語言

C語言標頭檔案正確寫法

目錄 一般寫法 自動生成 輸入 執行結果 參考連結 一般寫法 例如這樣有一根file.h標頭檔案,一般寫法如下 //file.h //條件編譯 #ifndef _FILE_H_ //如果沒有

c++--模板與泛型編程

編譯 string std size_t har rom 數組大小 傳遞 成員函數 一、定義模板 1.1 函數模板 1. 適用情況:如果兩個函數幾乎是相同的,唯一的差異是參數的類型,函數體則完全一樣。 2. 定義 template <模板參數列表(以逗號分隔)&g

C++ 模板(一)

c++ 模板C++模板類似與C#/Java當中的泛型,即可使用同樣的代碼實現不同的功能。效果類似於繼承(父對象指針指向子指針)。一 : 函數模板#include <iostream> using namespace std; template<typename T>//<type

C++ 模板詳解(二)(轉)

創建 規則 error ++ 例如 public err iostream () 四、類模板的默認模板類型形參   1、可以為類模板的類型形參提供默認值,但不能為函數模板的類型形參提供默認值。函數模板和類模板都可以為模板的非類型形參提供默認值。   2、類模板的類型形

C++模板編譯模型

pre str 查找 enc 生成可執行文件 turn 對象 endif 使用 一:傳統的編譯模型 使用C/C++進行編程時,一般會使用頭文件以使定義和聲明分離,並使得程序以模塊方式組織。將函數聲明、類的定義放在頭文件中,而將函數實現以及類成員函數的定義放

C++模板類頭文件和實現文件分離

證明 about compile strong 驗證 title htm -c itl http://www.cnblogs.com/lvdongjie/p/4288373.html 如何實現C++模板類頭文件和實現文件分離,這個問題和編譯器有關。 引用<<

C++模板特化與偏特化

type 舉例 its 進一步 數據類型 類型 orm special template C++模板說到C++模板特化與偏特化,就不得不簡要的先說說C++中的模板。我們都知道,強類型的程序設計迫使我們為邏輯結構相同而具體數據類型不同的對象編寫模式一致的代碼,而無法抽取其中的

C++ 模板

出現 string copy 根據 設計 template nbsp 調用 四種 泛型程序設計與模板: 一種算法在實現時不指定具體要操作的數據的類型的程序設計方法。所謂"泛型"是指算法只要實現 一遍,就能適用於多種數據類型。泛型程序設計方法的好處在於能夠減

C++模板的使用

std push_back out algo names line emp ++ 定義 1 #include <iostream> 2 #include <algorithm> 3 #include <bitset> 4

c++模板--類型擦除

ucs odk http dmr ocs gyp www cst inf aq鍬從坦0si盅4叭vtjhttp://shequ.docin.com/vfvj36952 6準耐背贍62惶d爛卦zphttp://tushu.docin.com/sina_6364886876 時

【tmp post】c++模板

spa fun public blog temp nbsp class col tmp 2017-12-29 1 // see file functional: class function<_Res(_ArgTypes...)> 2 template&l

C#模板設計模式使用和學習心得

傳統 oracle 設計模式 管理系統 邏輯 導致 www. 離開 不回 模板設計模式: 模版方法模式由一個抽象類和一個(或一組)實現類通過繼承結構組成,抽象類中的方法分為三種: 抽象方法:父類中只聲明但不加以實現,而是定義好規範,然後由它的子類去實現。

c++模板

定義函數 成員函數 post pan style template clu add put 模板一般分函數模板與類模板 函數模板: 解決,不同數據進行同種操作時,可以給數據定義一個模板類型,以達到函數的通用性 基本語法 template <typename T>

學藝不精而慚愧--論C++模板類的使用

今天 lease stat entire 網上 永遠 hat efi 這樣的 自己斷斷續續地使用C++也有一段時間了。有些時候產生了自滿的情緒。覺得自己對C++的語言

c++模板函數

clas 實例 定義 HR pan 是把 init 傳統 oid 模板特化(也有翻譯為模板具體化)(specialization) ??如果把模板函數當作數學歸納法的話,模板特化就是n=常數C的情況。 //模板函數聲明 template <typename T>

C#中正確使用enum累做Key的姿勢

mes pan icc 但是 equals .text 方法 帶來 lec C#中自定義enum,然後將其作為Dictionary的Key,通常的做法如下: using System; using System.Text; using System.Collections

C++模板之實例化和具體化

++ ati UC AR 情況 增加 .com 定義 存在 模板聲明 template<typename/class T>, typename比class最近後添加到C++標準。 常規模板,具體化模板,非模板函數的優先調用順序。 非模板函數(普通函數)&g