C++11引入了外部模板的概念,用于显式实例化模板,以便在编译期间减少重复实例化,从而减少编译时间和可执行文件的大小。
1. 外部模板的定义:
在声明模板的头文件中,使用extern template关键字来声明该模板的实例化定义将在其他地方进行,而不是当前编译单元中。示例代码如下:
// Vector.h
#ifndef VECTOR_H
#define VECTOR_H
template <typename T>
class Vector {
public:
T x;
T y;
Vector(T x_val = 0, T y_val = 0) : x(x_val), y(y_val) {}
T length() const;
};
// 外部模板声明
extern template class Vector<int>;
#endif // VECTOR_H
在上述示例中,我们使用extern template class Vector<int>;声明了Vector<int>的外部模板。
2. 用法示例:
在另一个源文件中,我们对Vector<int>进行具体实例化,并将其定义为外部模板。示例代码如下:
// Vector.cpp
#include "Vector.h"
// 具体实例化并定义为外部模板
template class Vector<int>;
// 其他代码
在上述示例中,我们在Vector.cpp源文件中对Vector<int>进行了具体实例化,并将其定义为外部模板。这意味着编译器在这个源文件中不会对Vector<int>进行实例化,而是等待链接器在其他编译单元中找到对应的实例化定义。
需要注意的是,外部模板的具体实例化定义必须在某个编译单元中进行,否则链接器将无法找到对应的实例化定义,导致链接错误。