明示的インスタンス化宣言の例

図 1 は、明示的インスタンス化宣言の単純かつ標準的な使用を示しています。 ヘッダー (sample1.h) に明示的インスタンス化宣言が含まれています。 変換単位の 1 つ (sample1a.C) が、明示的インスタンス化定義を含みます。 別の変換単位 (sample1b.C) では、特殊化を複数回インスタンス化することなく、その特殊化を使用できます。
図 1. 明示的インスタンス化宣言の単純かつ標準的な使用
sample1.h:
template <typename T, T val> 
union A {
T foo();
};

extern template union A<int, 55>;

template <class T, T val>
T A<T, val>::foo(void) {
return val;
}

sample1a.C:
#include "sample1.h"

template union A<int, 55>; 

sample1b.C:
#include "sample1.h"

int main(void) {
return A<int, 55>().foo();
}
図 2 では、誤った使用例を示します。 この場合、仮想メンバー関数 foo() の明示的インスタンス化宣言がありますが、この関数の明示的インスタンス化定義は見あたりません。
図 2. 明示的インスタンス化宣言の誤った使用
sample2.C:
template <typename T, T val>
struct A {
virtual T foo();
virtual T bar();
};

extern template int A<int, 55>::foo();

template <class T, T val>
T A<T, val>::foo(void) {
return val;
}

template <class T, T val>
T A<T, val>::bar(void) {
return val;
}

int main(void) {
return A<int, 55>().bar();
}