C++ プログラミングガイド

関数テンプレートの定義

テンプレートは宣言と定義の両方が必要になります。テンプレートを「定義」することで実装に必要な情報が得られます。次の例は、前述の例で宣言されたテンプレートを定義しています。


template <class Number> Number twice( Number original )
    { return original + original; }

テンプレート定義は通常ヘッダーファイルで行われるので、テンプレート定義が複数のコンパイル単位で繰り返される可能性があります。しかし、すべての定義は同じでなければなりません。この制限は「単一定義ルール」と呼ばれます。

C++ 5.0 では、関数テンプレートには型名ではないテンプレートパラメータは使用できません。たとえば、次のテンプレートは、その引数が型ではなく式であるため使用できません。


template <int count> void foo( )  // パラメータが型名ではないので無効
{
    int x[count]supported non-type parameter
    for (int i = 0; i < count; ++i ) 
        // ... x により何かを行う
}

foo<10>(); // テンプレート引数 10 により foo を呼び出そうとするが、無効