這個feature叫做Export Template,即外名模板,它的作用在於使得模板程式碼可依照C/C++語言習慣,將模板宣告和實現分開分別放到.h和.cpp檔案中,並且可以減少冗長的模板編譯時間(否則同一模板例項需要在不同編譯單元中分別例項化)。Export Template曾經是被寫入C++98標準中的,然並卵,很少有主流編譯器支援這一特性。在最新的C++11標準中,它已經被除名了,代之使用extern關鍵字阻止編譯器在某編譯單元內例項化特定模板。Export Template的實現原理,摘錄自《深入實踐C++模板程式設計》。
這個feature叫做Export Template,即外名模板,它的作用在於使得模板程式碼可依照C/C++語言習慣,將模板宣告和實現分開分別放到.h和.cpp檔案中,並且可以減少冗長的模板編譯時間(否則同一模板例項需要在不同編譯單元中分別例項化)。Export Template曾經是被寫入C++98標準中的,然並卵,很少有主流編譯器支援這一特性。在最新的C++11標準中,它已經被除名了,代之使用extern關鍵字阻止編譯器在某編譯單元內例項化特定模板。Export Template的實現原理,摘錄自《深入實踐C++模板程式設計》。
在編譯main.cpp時,como的處理與其他編譯器並無太大差異,也是生成一個對square<float>的呼叫等待連結。而在編譯square.cpp時,由於square模板宣告是一個外名模板,雖然como不會為其生成任何模板例項程式碼,但是會額外生成一個square.et檔案,其中包含對square函式模板實現的索引資訊。之後進入一個預連結(prelink)階段。在此階段,編譯器將根據之前編譯時發現的對模板例項的需求,從所有et檔案中查詢到所需模板實現所在程式碼檔案(cpp檔案),並重新編譯出所需模板例項。例如例1.8中,在main.cpp中呼叫了square<float>。那麼como將從square.et檔案中找到模板square的實現在檔案square.cpp中,然後重新編譯square.cpp以生成square<float>供連結使用。隨後的連結過程和其他C++編譯器類似,最終形成連結完整的可執行檔案。有點類似於C++編譯器處理全域性類物件例項構造的過程,它們需要在main函式之前構造好。而現代編譯器通常的模板實現方式是在編譯單元當場生成例項,隨後在連結時從重複例項中隨機挑選一個進行連結。然而為了支援Export Template,需要對現有編譯器做出巨大改動。從人力時間成本考慮,並且有work around可替代方法,Export Template最終被大部分編譯器拋棄了。於是C++的模板庫,一定是開源的^ ^