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