什么是模板模板参数?
当使用 template <template <typename> class T>
这样的语法时,必须使用关键字 class
,如果使用 typename
会出现以下错误:
error: template template parameter requires 'class' after the parameter list
在声明模板参数的基本情况下,typename
和 class
关键字可以互换使用。
你可以认为在使用模板模板时要求使用 class
是因为你需要传递一个类类型,但并非总是如此(特别是在C++11引入模板类型别名之后)。
template <template <typename> class T> // 'class' keyword required.
struct Foo {
using type = T<int>;
};
template <typename T>
using type = T (*)();
using func_ptr_t = Foo<type>::type;
这背后的原因是什么?
typename
为什么在模板模板声明中不被允许?是否有特定原因?- C++标准是否对此有规定?
typename
。 - chris