100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > C++ Primer 5th笔记(chap 16 模板和泛型编程)实例化

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

时间:2019-07-27 22:59:11

相关推荐

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 声明必须出现在任何使用此实例化版本的代码之前

// /****************** 这些模板类型必须在程序其他位置进行实例化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类将不在本文件中进行实例化。这些模板的定义必须出现在程序的其他文件中:

// // 实例化文件必须为每个在其他文件中声明为 extern 的类型和函数提供一个( 非 extern )// 的定义template int compare (const int &, const int & );template class Blob<string>; // 实例化类模板的所有成员

当编译器遇到一个实例化定义 ( 与声明相对 ) 时, 它为其生成代码。 因此, 文件templateBuild.o 将会包含 compare 的 int 实例化版本的定义和 Blob类的定义。 当我们编译此应用程序时, 必须将 templateBuild.o 和 Application.o 链接到一起

2.2 实例化定义会实例化所有成员

一个类模板的实例化定义会实例化该模板的所有成员, 包括内联的成员函数。

当编译器遇到一个实例化定义时, 它不了解程序使用哪些成员函数。编译器会实例化该类的所有成员。 即使我们不使用某个成员, 它也会被实例化。 因此, 我们用来显式实例化一个类模板的类型, 必须能用于模板的所有成员

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。