【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
在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楼
是有区别的,你应该更喜欢class
来typename
。
但为什么?
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
保持其重载意义。
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3154597