「テンプレート」テンプレート引き数

C++「テンプレート」テンプレート・パラメーターのテンプレート引き数は、クラス・テンプレートの名前です。

コンパイラーが「テンプレート」テンプレート引き数と一致するテンプレートの検索を試みる場合、 それは主クラス・テンプレートだけを検索します。 (主テンプレート とは、特殊化しようとしているテンプレートのことです。) コンパイラーは、たとえそれらのパラメーター・リストが、 「テンプレート」テンプレート・パラメーターのリストと一致していても、部分的な特殊化は考慮に入れません。 例えば、コンパイラーは、次のコードを許可しません。

template<class T, int i> class A {
   int x;
};
 
template<class T> class A<T, 5> {
   short x;
};
 
template<template<class T> class U> class B1 { };
 
B1<A> c;

コンパイラーは、宣言 B1<A> c を許可しません。A の部分的な特殊化は、B1 の「テンプレート」テンプレート・パラメーター U と一致しているように見えますが、コンパイラーは、U とは異なるテンプレート・パラメーターを持つ、主テンプレート A だけを考慮に入れます。

「テンプレート」テンプレート・パラメーターを基にした特殊化のインスタンスをいったん作成すると、 コンパイラーは、それに対応する「テンプレート」テンプレート引き数に基づく部分的な特殊化を考慮に入れます。 次の例は、このことを示しています。

#include <iostream>
using namespace std;
 
template<class T, class U> class A {
   int x;
};
 
template<class U> class A<int, U> {
   short x;
};
 
template<template<class T, class U> class V> class B {
   V<int, char> i;
   V<char, char> j;
};
 
B<A> c;
 
int main() {
   cout << typeid(c.i.x).name() << endl;
   cout << typeid(c.j.x).name() << endl;
}

次に、上記の例の出力を示します。

short
int

宣言 V<int, char> i は、部分的な特殊化を使用しますが、 宣言 V<char, char> j は、主テンプレートを使用します。

関連参照

IBM Copyright 2003