C++ 模板放置在 .h 文件中的一個原因

一直沒有對 C++ 模板做過系統的學習,對於 STL 模板類或者函數,都是查查文檔就直接使用。不過在翻開 STL 代碼的時候,都曾注意到那些模板是放置在.h文件中的,至於爲何,卻是沒有去想過。

今天在編寫一個動態連接庫的時候,才明白其中的原因。比如庫裏面有下面模板類

 

template <typename Data>

class concurrent_queue

{

public:

  concurrent_queue(unsigned capacity);

  ~concurrent_queue();

 

  bool push(const Data&);

  void pop(Data&, int timeout = -1);

 

...

};


 

開始我習慣性的將這個模板類的實現放在 .cpp 文件裏面,編譯出來的 .so 都正常。但是在使用這個模板的時候,就出現問題。

 

比如

 

class Message

{

...

}

 

concurrent_queue<Message *> message_queue;

 

Message * pMsg = new Message();

message_queue.push(pMsg);

...


 

那麼在連接上面的 .so 時,會出現下面的錯誤

XXX.so: undefined reference to `concurrent_queue<Message*>::push(const Message* &)'

那是因爲編譯器無法生成對應 Message *的實現,如果將模板類全部放置在 .h 文件裏面,那麼就不存在這個問題了。

 

模板編程對於代碼重用確實有很大的實用性,不亞於繼承和封裝。

 

C++ Templates Tutorial http://www.iis.sinica.edu.tw/~kathy/vcstl/templates.htm

The declarations and definitions of the class template member functions should all be in the same header file.

 

發佈了104 篇原創文章 · 獲贊 3 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章