(それほど新しくはない) 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) コードですか?それともうまくいったのは幸運でしょうか?
point.cpp
C++11 では、 inを含めてmain.cpp
宣言することで同じことを実現できextern template <int dim> struct Point;
ますか?