可能重复:
模板中关键字'typename'和'class'的C ++差别 web
在C ++中定义函数模板或类模板时,能够这样写: 函数
template <class T> ...
或者能够这样写: spa
template <typename T> ...
是否有充分理由偏好一个而不是另外一个? code
我接受了最受欢迎(也颇有趣)的答案,但真正的答案彷佛是“不,没有理由更喜欢一个而不是另外一个。” blog
typename
。 class
。 但请注意,在模板模板参数的状况下,在C ++ 17以前,须要使用class
而不是typename
。 请参阅下面的user1428839的答案 。 (但这个特殊状况不是偏好问题,而是语言的要求。) ip
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'
class
来typename
。 typename
对于模板模板参数是非法的,所以为了保持一致,您应该使用class
: it
template<template<class> typename MyTemplate, class Bar> class Foo { }; // :( template<template<class> class MyTemplate, class Bar> class Foo { }; // :)
扩展DarenW的评论。 io
一旦不接受typename和class很是不一样,对它们的使用严格可能仍然有效。 仅当class真的是类时使用class,而且当它是基本类型时使用typename,例如char 。
确实也接受这些类型而不是typename
template < char myc ='/'>
在这种状况下,甚至优于typename或class。
想一想其余人的“暗示”或可理解性。 而且实际上认为第三方软件/脚本可能会尝试使用代码/信息来猜想模板发生了什么(考虑swig)。
据我所知,你使用哪个并不重要。 它们在编译器的眼中是等价的。 使用您喜欢的任何一种。 我一般上课。
Stan Lippman 在这里谈到了这一点 。 我以为这颇有趣。
简介 :Stroustrup最初使用class
来指定模板中的类型,以免引入新的关键字。 委员会中的一些人担忧这种关键字的超载致使了混乱。 后来,委员会引入了一个新的关键字typename
来解决语法歧义,并决定让它也用于指定模板类型以减小混淆,但为了向后兼容, class
保持其重载意义。