2

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

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

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

1 回答 1

1

14.3 [温度参数] p1

" template-argument有 3 种形式,对应于template-parameter的三种形式:type、non-type 和template。template-id中指定的每个template-argument的类型和形式都应与指定的类型和形式相匹配对于模板在其模板参数列表中声明的相应参数。

该参数~Helper没有模板模板参数的正确类型template<typename> class T,它不是类模板。

14.3.3 [temp.arg.template] p1

模板模板参数的模板参数应是类模板的名称,表示为id-expression

~Helper不是类模板的名称。

这很明显排除了你的例子。

于 2012-06-16T02:11:40.443 回答