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

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

template <class T> ...

或者你可以这样写:

template <typename T> ...

有充分的理由选择其中一个而不是另一个吗?


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

它们是等价的(除了下文所述)。 有些人总是使用typename是有原因的。 有些人总是有理由使用阶级。 有些人有理由两者都用。 有些人不在乎他们用的是哪一种。

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


当前回答

这一点都不重要,但是class使它看起来像T只能是一个类,而它当然可以是任何类型。typename更准确。另一方面,大多数人使用class,所以这可能更容易阅读。

其他回答

我更喜欢使用typename,因为我不喜欢重载关键字(哎呀——静态对于各种不同的上下文有多少不同的含义?)

作为上述所有文章的补充,在处理模板模板参数时,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'

据我所知,你用哪一种都没关系。在编译器看来,它们是等价的。你喜欢哪个就用哪个。我通常使用class。

这一点都不重要,但是class使它看起来像T只能是一个类,而它当然可以是任何类型。typename更准确。另一方面,大多数人使用class,所以这可能更容易阅读。

两者是有区别的,您应该更喜欢class而不是typename。

但是为什么呢?

Typename对于模板模板参数来说是非法的,所以为了保持一致,你应该使用class:

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