对于模板,我已经看到了两个声明:
template < typename T >
template < class T >
有什么不同?
在以下示例中,这些关键字究竟是什么意思(取自德语维基百科关于模板的文章)?
template < template < typename, typename > class Container, typename Type >
class Example
{
Container< Type, std::allocator < Type > > baz;
};
原文由 Mat 发布,翻译遵循 CC BY-SA 4.0 许可协议
typename
和class
在指定模板的基本情况下可以互换:和
是等价的。
话虽如此,在某些特定情况下,
typename
和class
之间存在差异。第一个是依赖类型的情况。
typename
用于声明当您引用依赖于另一个模板参数的嵌套类型时,例如typedef
在此示例中:您在问题中实际显示的第二个,尽管您可能没有意识到:
指定 模板模板 时,必须使用
class
关键字 - 在这种情况下,它 不能 与typename
互换 (注意:由于 C++17 允许在本例) 。在显式实例化模板时,您还必须使用
class
:我确定还有其他一些我错过的情况,但底线是:这两个关键字并不等效,这些是一些常见的情况,您需要使用其中的一个或另一个。