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

Posted thefist11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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笔记(chap 16 模板和泛型编程)std::move

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

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

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

C++ Primer 5th笔记(chap 16 模板和泛型编程)可变参数模板

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