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

新手上路,请多包涵

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

 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 许可协议

阅读 1.4k
2 个回答

typenameclass 在指定模板的基本情况下可以互换:

 template<class T>
class Foo
{
};

template<typename T>
class Foo
{
};

是等价的。

话虽如此,在某些特定情况下, typenameclass 之间存在差异。

第一个是依赖类型的情况。 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 互换 (注意:由于 C++17 允许在本例)

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

 template class Foo<int>;

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

原文由 Aaron Klotz 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用 <typename T><class T> 没有区别;即,它是 C++ 程序员使用的约定。我自己更喜欢 <typename T> 因为它更清楚地描述了它的用途;即定义具有特定类型的模板。

注意:在声明模板模板参数时,您必须使用 class (而不是 typename )有一个例外:

 template <template <typename> class    T> class C { }; // valid!

template <template <typename> typename T> class C { }; // invalid!

在大多数情况下,您不会定义嵌套模板定义,因此任何一个定义都可以工作——只是在您的使用中保持一致。

原文由 Gurpreet Singh 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题