テンプレート パラメーターの可能な形式の 1 つは、クラス テンプレートです。C++ 標準 (C++2003) では、テンプレートのインスタンス化中のテンプレート テンプレート パラメーターの引数は "id-expression" であると規定されています。この非終端記号はかなり広いです。デストラクタ、オーバーロードされた演算子などを許可します。たとえば、次のコードは正常にコンパイルされるはずです。
template <template <typename x> class T>
struct MyClass
{
T<int> a;
T<double> b;
};
template <typename x> struct Helper
{
~Helper() { }
x operator+(x p) { return(x[1]+p); }
x[4] c;
};
MyClass<Helper> p1;
MyClass<~Helper> p2;
MyClass<Helper::operaror+> p3;
最後の 2 行は意味がありません。しかし、文法の観点からは、それらは問題ありません。文法は言語を正確に記述するものではありません (またそうすべきではありません) が、段落 14.3.3、「テンプレート テンプレート引数」では、この文脈における文法規則の制限について言及していません。
誰かが私の声明を受け入れたり、反論したりできますか:
- テンプレート テンプレートの引数は識別子のみであり、修飾されている可能性があります。
- ポイント 1 が正しい場合、これは標準で言及する価値があることは間違いありません。