テンプレート

template < template-parameter-list > declaration
テンプレートの仕様 | MSDN

定義

包含モデル (inclusion model)

宣言に定義を含めます。ヘッダーに定義を含めるため、コンパイルに時間がかかることがあります。

template <typename T>
class MyClass
{
public:
    MyClass()
    {
    }

    T Add(const T& a, const T& b)
    {
        return a + b;
    }
};

明示的なインスタンス化モデル (explicit instantiation model)

宣言と定義を分けます。テンプレートの定義時に、インスタンス化する型を指定します。

// 宣言
template <typename T>
class MyClass
{
public:
    MyClass();

    T Add(const T& a, const T& b);
};
// 定義
template <typename T>
MyClass<T>::MyClass()
{
}

template <typename T>
T MyClass<T>::Add(const T& a, const T& b)
{
    return a + b;
}

template MyClass<int>;
template MyClass<double>;

指定されていない型では、インスタンス化できません。

MyClass<int>    sample1; // ok
MyClass<double> sample2; // ok
MyClass<long>   sample3; // error LNK2019: 未解決の外部シンボル

参考

参考書

  • プログラミング言語C++ 第3版 [アジソン・ウェスレイ・パブリッシャーズ・ジャパン] Bjarne Stroustrup
    13章「テンプレート」
  • Effective C++ 原著 第3版 [ピアソン・エデュケーション] スコット・メイヤーズ
    7章「テンプレートとジェネリックプログラミング」
Microsoft Learnから検索