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

眉间皱痕 提交于 2020-01-07 21:02:15

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

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

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

template <class T> ...

或者可以这样写:

template <typename T> ...

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


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

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

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


#1楼

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

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对于模板模板参数是非法的,因此为了保持一致,您应该使用class

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

#3楼

扩展DarenW的评论。

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

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

template < char myc ='/'>

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

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


#4楼

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


#5楼

Stan Lippman 在这里谈到了这一点 。 我觉得这很有趣。

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!