可能的重复:
模板中关键字' typename '和' class '的c++差异
在c++中定义函数模板或类模板时,可以这样写:
template <class T> ...
或者你可以这样写:
template <typename T> ...
有充分的理由选择其中一个而不是另一个吗?
我接受了最流行(也是最有趣)的答案,但真正的答案似乎是“不,没有充分的理由更喜欢其中一个而不是另一个。”
它们是等价的(除了下文所述)。
有些人总是使用typename是有原因的。
有些人总是有理由使用阶级。
有些人有理由两者都用。
有些人不在乎他们用的是哪一种。
但是请注意,在c++ 17之前,在模板模板形参的情况下,需要使用class而不是typename。请参阅下面user1428839的回答。(但这种特殊情况不是个人偏好的问题,而是语言的要求。)
作为上述所有文章的补充,在处理模板模板参数时,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'
为了回应Mike B,我更喜欢使用'class',因为在模板中,'typename'有一个重载的含义,但'class'没有。以这个检查型整型为例:
template <class IntegerType>
class smart_integer {
public:
typedef integer_traits<Integer> traits;
IntegerType operator+=(IntegerType value){
typedef typename traits::larger_integer_t larger_t;
larger_t interm = larger_t(myValue) + larger_t(value);
if(interm > traits::max() || interm < traits::min())
throw overflow();
myValue = IntegerType(interm);
}
}
Larger_integer_t是一个依赖名称,因此需要在它前面加上'typename',以便解析器能够识别Larger_integer_t是一个类型。另一方面,Class没有这样的重载含义。
那或者我只是内心懒惰。我输入“class”的频率远远超过“typename”,因此我发现它更容易输入。或者这可能是我写了太多OO代码的标志。