日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ Primer 5th笔记(chap 16 模板和泛型编程)实例化

發布時間:2025/3/21 c/c++ 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 模板和泛型编程)实例化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。