模板参数的一种可能形式是类模板。 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;
最后两行没有任何意义。但从语法的角度来看,他们很好。语法不是(也不应该)完全描述语言,但是段落14.3.3,&#34;模板模板参数&#34;在这种情况下,没有提到对语法规则的任何限制。
任何人都可以接受或反驳我的陈述:
答案 0 :(得分:1)
“ template-argument 有三种形式,对应于 template-parameter 的三种形式:type,non-type和template。类型和形式 template-id 中指定的每个 template-argument 应与模板在其template-parameter-list中声明的相应参数的类型和形式相匹配。
参数~Helper
没有适合模板模板参数template<typename> class T
的类型,它不是类模板。
14.3.3 [temp.arg.template] p1
模板的 template-argument template-parameter 应为类模板的名称,表示为 id-expression 。< / p>
~Helper
不是类模板的名称。
这清楚地排除了你的例子。