一直覺得模板類是特別神奇的東西,它可以構造出不同型別的物件,使**更加的靈活。這個過程就是類模板的例項化。
我們使用類的模板寫乙個stack類:
#include#include"seqlist1.h"
using namespace std;
templateclass container = seqlist>
class stack
void pop()
bool empty()
size_t size()
t& top()
void print()
t& operator(size_t index)
protected:
container _con;
};
其中我們可以傳入不同型別的t,class continer是型別t的乙個容器,這裡預設是用自定義的乙個順序表來當容器。編譯器就會構造出不同的**出來。
這樣的實現方式是在類內定義成員函式,並把整個類放在.h中,這種方式叫做類模板的包含模式。這樣的定義方式是有好處的,要使用stack這個類,只要在標頭檔案內包含類體就可以了,編譯器很容易就可以找到類的定義。當然這種方式是有弊端的,如果乙個類的成員函式個數很多並且很複雜,無疑在你去閱讀或者修改定義的時候會讓人很頭疼,不能快速找到成員函式的定義。
還好c++提供了另外一種方式——將成員函式的宣告放在類體內.h中,將函式的定義放在.cpp中,就相當與類外定義,我們把這種方式叫做類模板的分離模式。這樣寫出來的**是很美觀的,並且易於修改。
//.h檔案
#include#include"seqlist1.h"
using namespace std;
templateclass container = seqlist>
class stack
;//.cpp檔案
//類外定義
templateclass container = seqlist>
void push(const t& x)
templateclass container = seqlist>
void pop()
templateclass container = seqlist>
bool empty()
templateclass container = seqlist>
size_t size()
templateclass container = seqlist>
t& top()
templateclass container = seqlist>
void print()
templateclass container = seqlist>
t& operator(size_t index)
類模板的分離模式就會牽扯出一些問題,比如說編譯器在構造物件的時候它怎麼找函式的定義的,因為函式的定義是在.cpp檔案中的。這就是類模板的分離編譯問題。
假設我們stack類是放在stack.h中的,成員函式的定義放在stack.cpp中的,然後類的呼叫放在main.cpp中,並且在main.cpp中包含了stack.h。
按照我們通常的思路:
但是當你編譯的時候,編譯器就會報鏈結錯誤,找不到成員函式的定義。說明我們的思路是錯誤的。對於模板,在沒有例項化出物件之前是不會被編譯成二進位制**的,而例項化是在程式執行的時候(也就是用到模板的時候)才例項化出物件,例項化是在編譯器對**進行編譯的後面才發生的。這樣問題就迎刃而解了,我們得手動的在main中包含.cpp檔案,讓編譯器知道有函式的定義,這樣編譯器就不會報錯了。
這裡有必要提醒(總結)一下的是:
本文出自 「稻草陽光」 部落格,請務必保留此出處
類模板的分離編譯問題
類模板的分離編譯,即模板類的定義和其模板成員函式 介面 的定義不在同一檔案中。如模板類的定義在.h標頭檔案中,同時在.h標頭檔案中宣告介面,而在模板類之外的.cpp檔案中定義介面。此時在main函式中,如果只引用.h標頭檔案,編譯會報錯。原因 大多數編譯器,不支援類模板的分離編譯!1 實現分離編譯 ...
模板的分離編譯
模板為什麼不支援分離編譯 要了解這個問題,我們先來看一下程式在計算機中的執行過程,用一幅圖簡單說明。在乙個規範的c 檔案中,我們通常把乙個檔案分為 檔案宣告,檔案實現和檔案測試三個部分。在一般的編譯環境中,h檔案的 都會擴充套件到.cpp裡面,然後編譯器對.cpp檔案編譯形成.obj檔案,cpp以分...
模板的分離編譯
模板不支援分離編譯 我們來分析一下模板為什麼不支援分離編譯呢,所謂的分離編譯就是我們在編寫程式的時候可能會出現如下的一種情況就是,我下面就是舉具體的例子了 template.h includeusing namespace std templateclass a template.cpp inclu...