小编典典

模板中关键字“typename”和“class”的区别?

all

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

template < typename T >
template < class T >

有什么不同?

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

template < template < typename, typename > class Container, typename Type >
class Example
{
     Container< Type, std::allocator < Type > > baz;
};

阅读 227

收藏
2022-03-03

共1个答案

小编典典

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必须按上述方式使用关键字——在这种情况下 不能 互换 (注意:由于 C++17
在这种情况下允许使用这两个关键字)
typename __

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

template class Foo<int>;

我确定还有其他一些我错过的情况,但最重要的是:这两个关键字并不等价,这些是您需要使用其中一个或另一个的一些常见情况。

2022-03-03