C++ Primer 5th笔记(chap 16 模板和泛型编程)实例化
生活随笔
收集整理的這篇文章主要介紹了
C++ Primer 5th笔记(chap 16 模板和泛型编程)实例化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 問題
當兩個或多個獨立編譯的源文件使用了相同的模板,并提供了相同的模板參數時, 每個文件中就都會有該模板的一個實例。
2. 解決方法
顯式實例化 (explicit instantiation) 來避免開銷。
extern template declaration; template declaration;declaration 是一個類或函數聲明, 其中所有模板參數已被替換為模板實參。 eg.
// 實例化聲明與定義 extern template class Blob<string>;//聲明 template int compare (const int &, const int & ); / / 定義2.1 編譯器在使用一個模板時自動對其實例化, 因此 extern 聲明必須出現在任何使用此實例化版本的代碼之前
// Application.cc /****************** 這些模板類型必須在程序其他位置進行實例化 extern template class Blob<string>; extern template int compare (const int &, const int& );// 實例化會出現在其他位置 Blob<string> sal, sa2; // Blob<int>及其接受 initializer_list 的構造函數在本文件中實例化 Blob<int> al = { 0,1,2,3,4,5,6,7,8,9 }; Blob<int> a2 (al); / / 拷貝構造函數在本文件中實例化 inti = compare (al [ 0], a2 [ 0] ); / / 實例化出現在其他位置compare函數和 Blob類將不在本文件中進行實例化。這些模板的定義必須出現在程序的其他文件中:
// templateBuild.cc // 實例化文件必須為每個在其他文件中聲明為 extern 的類型和函數提供一個( 非 extern ) // 的定義 template int compare (const int &, const int & ); template class Blob<string>; // 實例化類模板的所有成員當編譯器遇到一個實例化定義 ( 與聲明相對 ) 時, 它為其生成代碼。 因此, 文件templateBuild.o 將會包含 compare 的 int 實例化版本的定義和 Blob類的定義。 當我們編譯此應用程序時, 必須將 templateBuild.o 和 Application.o 鏈接到一起
2.2 實例化定義會實例化所有成員
一個類模板的實例化定義會實例化該模板的所有成員, 包括內聯的成員函數。
當編譯器遇到一個實例化定義時, 它不了解程序使用哪些成員函數。編譯器會實例化該類的所有成員。 即使我們不使用某個成員, 它也會被實例化。 因此, 我們用來顯式實例化一個類模板的類型, 必須能用于模板的所有成員
總結
以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 16 模板和泛型编程)实例化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ Primer 5th笔记(cha
- 下一篇: C++ Primer 5th笔记(cha