使用'class'或'typename'做为模板参数? [重复]

可能重复:
模板中关键字'typename'和'class'的C ++差别 web

在C ++中定义函数模板或类模板时,能够这样写: 函数

template <class T> ...

或者能够这样写: spa

template <typename T> ...

是否有充分理由偏好一个而不是另外一个? code


我接受了最受欢迎(也颇有趣)的答案,但真正的答案彷佛是“不,没有理由更喜欢一个而不是另外一个。” blog

  • 它们是等价的(除非以下所述)。
  • 有些人有理由老是使用typename
  • 有些人有理由老是使用class
  • 有些人有理由同时使用这两种方法。
  • 有些人并不关心他们使用哪个。

但请注意,在模板模板参数的状况下,在C ++ 17以前,须要使用class而不是typename 。 请参阅下面的user1428839的答案 。 (但这个特殊状况不是偏好问题,而是语言的要求。) ip


#1楼

forced (up to and including C++14) when dealing with parameters, eg: 做为除了全部上述职位,使用的class关键字强制(直至并包括C ++ 14)与的参数,例如当处理: get

template <template <typename, typename> class Container, typename Type>
class MyContainer: public Container<Type, std::allocator<Type>>
{ /*...*/ };

在此示例中, typename Container将生成编译器错误,以下所示: 编译器

error: expected 'class' before 'Container'

#2楼

有区别的,你应该更喜欢classtypename

但为何?

typename对于模板模板参数是非法的,所以为了保持一致,您应该使用classit

template<template<class> typename MyTemplate, class Bar> class Foo { };    //  :(
template<template<class>    class MyTemplate, class Bar> class Foo { };    //  :)

#3楼

扩展DarenW的评论。 io

一旦不接受typename和class很是不一样,对它们的使用严格可能仍然有效。 仅当class真的是类时使用class,而且当它是基本类型时使用typename,例如char

确实也接受这些类型而不是typename

template < char myc ='/'>

在这种状况下,甚至优于typename或class。

想一想其余人的“暗示”或可理解性。 而且实际上认为第三方软件/脚本可能会尝试使用代码/信息来猜想模板发生了什么(考虑swig)。


#4楼

据我所知,你使用哪个并不重要。 它们在编译器的眼中是等价的。 使用您喜欢的任何一种。 我一般上课。


#5楼

Stan Lippman 在这里谈到了这一点 。 我以为这颇有趣。

简介 :Stroustrup最初使用class来指定模板中的类型,以免引入新的关键字。 委员会中的一些人担忧这种关键字的超载致使了混乱。 后来,委员会引入了一个新的关键字typename来解决语法歧义,并决定让它也用于指定模板类型以减小混淆,但为了向后兼容, class保持其重载意义。

相关文章
相关标签/搜索