模板实例化中可能的模板模板参数形式

时间:2012-06-16 02:04:11

标签: c++ template-templates

模板参数的一种可能形式是类模板。 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;在这种情况下,没有提到对语法规则的任何限制。

任何人都可以接受或反驳我的陈述:

  1. 模板模板参数只能是一个标识符,可能是合格的。
  2. 如果第一点是真的,这在标准中绝对值得一提。

1 个答案:

答案 0 :(得分:1)

14.3 [temp.arg] p1

  

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不是类模板的名称。

这清楚地排除了你的例子。