模板参数的一种可能形式是类模板。C++ 标准 (C++2003) 声明模板实例化期间模板模板参数的参数是“id 表达式”。这个非终端相当宽。它允许析构函数、重载运算符等。例如,以下代码应该可以正常编译:
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;
最后两行没有任何意义。但从语法的角度来看,它们很好。语法不是(也不应该)准确地描述语言,但是第 14.3.3 段,“模板模板参数”没有提到在这种情况下对语法规则的任何限制。
任何人都可以接受或反驳我的陈述:
- 模板模板参数只能是一个标识符,可能是合格的。
- 如果第一点属实,这在标准中绝对值得一提。