typename
and class
在指定模板的基本情况下可以互换:
template<class T>
class Foo
{
};
and
template<typename T>
class Foo
{
};
是等价的。
话虽如此,在某些特定情况下,两者之间存在差异typename
and class
.
第一个是依赖类型的情况。typename
用于声明何时引用依赖于另一个模板参数的嵌套类型,例如typedef
在这个例子中:
template<typename param_t>
class Foo
{
typedef typename param_t::baz sub_t;
};
您在问题中实际显示的第二个,尽管您可能没有意识到:
template < template < typename, typename > class Container, typename Type >
当指定一个模板 模板, the class
关键字必须按上面的方式使用——它是not可互换typename
在这种情况下(注意:自 C++17 起,在这种情况下两个关键字都是允许的).
您还必须使用class
当显式实例化模板时:
template class Foo<int>;
我确信我错过了其他情况,但底线是:这两个关键字并不等效,并且这些是您需要使用其中之一的常见情况。