我刚刚发现默认模板参数的一种奇怪语法
template<class T = class Z>
struct X
{};
在这种情况下,第二个“ class”关键字是什么意思?
答案 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
{};