(不再那么新的)C++11 标准引入了extern
模板关键字。它的目的是告诉编译器不应在使用时实例化模板,而是将在另一个翻译单元中实例化它(因此在链接时会有一个可用的实例化) - 至少 AFAIK。
现在,即使在 C++11 之前的时代,我们也使用类似的东西将模板类的声明/定义与其实例化分开,以加快编译速度,例如:
point.h:类定义
template <int dim> struct Point {
...
void foo();
...
};
point.cpp : 方法定义
#include "point.h"
template <int dim>
void Point<dim>::foo() {
...
}
point_2d.cpp : 类实例化(2D 版本)
#include "point.cpp"
template struct Point<2>;
point_3d.cpp : 类实例化(3D 版本)
#include "point.cpp"
template struct Point<3>;
main.cpp : 2D 和 3D 点的使用
#include "point.h"
int main(int, char**) {
Point<2> p;
p.foo();
}
现在我想知道:
- 我们的方法是有效的 C++(03 或 11)代码还是我们只是幸运地工作了?
- 使用 C++11,我们是否能够通过包含
point.cpp
inmain.cpp
和声明来实现相同的目标extern template <int dim> struct Point;
?