c – 模板中关键字’typename’和’class’的区别?

对于模板,我看到了两个声明:

template < typename T >
template < class T >

有什么不同?

这些关键字在下面的例子中究竟是什么意思(取自德国维基百科关于模板的文章)?

template < template < typename, typename > class Container, typename Type >
class Example
{
     Container< Type, std::allocator < Type > > baz;
};
最佳答案
在指定模板的基本情况下,typename和class是可互换的:

template<class T>
class Foo
{
};

template<typename T>
class Foo
{
};

是等价的.

话虽如此,有些特定情况下typename和class之间存在差异.

第一个是依赖类型的情况. typename用于在引用依赖于另一个模板参数的嵌套类型时声明,例如本示例中的typedef:

template<typename param_t>
class Foo
{
    typedef typename param_t::baz sub_t;
};

你在问题中实际显示的第二个,尽管你可能没有意识到:

template < template < typename, typename > class Container, typename Type >

在指定模板模板时,必须按上述方式使用class关键字 – 在这种情况下,它不能与typename互换(注意:因为在这种情况下C17允许两个关键字).

在显式实例化模板时,您还必须使用类:

template class Foo<int>;

我确信还有其他一些我错过的情况,但最重要的是:这两个关键字并不相同,而且这些是您需要使用其中一个的常见情况.

转载注明原文:c – 模板中关键字’typename’和’class’的区别? - 代码日志