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

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

template <class T> ...

或者你可以这样写:

template <typename T> ...

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


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

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

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


当前回答

根据Scott Myers, Effective c++(第三版)第42项(当然,这必须是最终答案)-区别是“没有”。

建议是,如果期望T始终是一个类,则使用“class”,如果期望其他类型(int, char*等等)则使用“typename”。把它当作一个用法提示。

其他回答

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

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

Stan Lippman在这里讲过。我觉得很有趣。

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

扩展DarenW的评论。

一旦typename和class不被认为有很大不同,严格使用它们可能仍然是有效的。仅当is确实是一个类时使用class,当它是基本类型时使用typename,例如char。

实际上也接受这些类型而不是typename

模板< char myc = '/' >

在这种情况下,它甚至优于typename或class。

想想“hintcompleteness”或对其他人的可理解性。实际上,要考虑到第三方软件/脚本可能会试图使用这些代码/信息来猜测模板发生了什么(考虑swig)。

根据Scott Myers, Effective c++(第三版)第42项(当然,这必须是最终答案)-区别是“没有”。

建议是,如果期望T始终是一个类,则使用“class”,如果期望其他类型(int, char*等等)则使用“typename”。把它当作一个用法提示。