小编典典

对模板参数使用“类”或“类型名”?

all

在 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'

阅读 127

收藏
2022-03-06

共1个答案

小编典典

Stan Lippman在这里谈到了这一点。我觉得这很有趣。

摘要 : Stroustrup
最初用于class在模板中指定类型以避免引入新关键字。委员会中的一些人担心这种关键字的重载会导致混乱。后来,委员会引入了一个新的关键字typename来解决语法歧义,并决定让它也用于指定模板类型以减少混淆,但为了向后兼容,class保留其重载含义。

2022-03-06