這段時間在學習C++中的模板,在網上看到有對"包含編譯模型"和"分別編譯模型"的說法:
看C++ templates吧,裡面對這個問題討論得很詳細。
包含編譯模型就是類模板的聲明和定義放在一個標頭檔裡
分離模型就是和將聲明與實現分開
不過要用到export關鍵字
根據我對書中內容的理解:
標準C++為編譯模板定義了兩種模型:包含模型和分別模型,這兩種方式很大程度上是相同的:類定義和函式宣告
放在標頭檔中,而函數定義和成員定義放在源檔案中.這兩種模型不同之處在於,編譯器怎樣使用來自源檔案的定義而已.
對"包含編譯模型",可以通過在聲明函數模板或類模板的標頭檔中添加一條#include指示使定義可用,
從而引入包含相關定義的源檔案.如下:
---------------------
// header file utlities.h
#ifndef AAAA_H
#define AAAA_H
template <class T> int compare(const T&, const T&);
......
#include "utilities.cc"
#endif
=======---------------
//implementation file utlities.cc
template <class T> int compare(const T &v1,const T &v2)
{
//implemente
......
}
-------------------
這一策略使我們能夠保持標頭檔和實現檔案分離.
本書的作者並不是說"包含編譯模型"就是將申明和定義放在同一個標頭檔中.這裡分別放在了utlities.h和utlities.cc中,
只是在utlities.h時用了#include "utlities.cc".
而"分離編譯模型"只是在使用了關鍵字"export"來告訴編譯器模板定義在哪裡引用.
如果在標頭檔類聲明中使用了export,則該標頭檔只能被源檔案使用一次;
如果在實現檔案中使用了export,有兩種情況:
一種是在實現檔案的開頭加上
export template <class Type> class Xxxx;
#include "Xxxx.h"
//others definitions
....
這類情況中,匯出類成員都會自動聲明為匯出.
另一種情況就是對個別成員聲明要匯出的,只能對個別成員使用export.
"包含編譯模型"並不是類模板的聲明和定義放在一個標頭檔裡;
"分離編譯模型"也並不是將申明和定義分開.