带类的默认模板参数

时间:2019-01-27 13:02:54

标签: c++ templates default-value

我刚刚发现默认模板参数的一种奇怪语法

template<class T = class Z>
struct X
  {};

在这种情况下,第二个“ class”关键字是什么意思?

1 个答案:

答案 0 :(得分:13)

这没什么特别的。 C ++允许您通过elaborated type specifier引用类。例如

void foo(class bar*);

这声明了一个函数foo,该函数接受类型为bar*的参数。如果先前未声明bar,则此复杂的类型说明符将在包含bar的命名空间中构成foo的声明。即就像您写过一样:

class bar;
void foo(bar*);

回到您的示例,X是一个类模板,它期望使用由class T表示的单个类型参数,但可能与typename T相同。所述类型参数具有默认参数,由详细的类说明符class Z命名。可以像上面的函数一样重写该声明:

class Z;
template<class T = Z>
struct X
  {};