在 C++ 中定义函数模板或类模板时,可以这样写:
template <class T> ...
或者可以这样写:
template <typename T> ...
有充分的理由偏爱其中一个吗?
我接受了最受欢迎(和有趣)的答案,但真正的答案似乎是“不,没有充分的理由偏爱其中一个。”
typename
class
但是请注意,在 C++17 之前,在 模板模板 参数的情况下,需要使用 ofclass代替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'
Stan Lippman在这里谈到了这一点。我觉得这很有趣。
摘要 : Stroustrup 最初用于class在模板中指定类型以避免引入新关键字。委员会中的一些人担心这种关键字的重载会导致混乱。后来,委员会引入了一个新的关键字typename来解决语法歧义,并决定让它也用于指定模板类型以减少混淆,但为了向后兼容,class保留其重载含义。