使用'class'或'typename'作为模板参数?
可能重复:
模板中关键字'typename'和'class'的C ++差异
在C ++中定义函数模板或类模板时,可以这样写:
template <class T> ...
或者可以这样写:
template <typename T> ...
是否有更好的理由相对于另一方偏好?
我接受了最流行的(和有趣的)答案,但真正的答案似乎是“不,没有理由相互选择一个。”
typename
。 class
。 但是,请注意,对于模板模板参数,需要使用class
而不是typename
。 请参阅下面的user1428839的答案。 (但这个特殊情况并不是偏好问题,而是语言的一个要求。)(这也会随着c++17
变化而变化)
斯坦利普曼在这里谈到了这一点。 我认为这很有趣。
简介:Stroustrup最初使用class
来指定模板中的类型,以避免引入新的关键字。 委员会中的一些人担心这个关键字的超载导致了混淆。 后来,委员会引入了一个新的关键字typename
来解决语法歧义,并决定让它也用于指定模板类型以减少混淆,但为了向后兼容, class
保持其超载的含义。
根据Scott Myers,Effective C ++(第三版)第42项(当然必须是最终答案) - 区别是“没有”。
如果预期的话,建议是使用“类”,如果预期其他类型(int,char * whatever),T将永远是一个类,带有“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'
请参阅http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4051.html,了解C ++ 14模板模板中是否接受typename。
链接地址: http://www.djcxy.com/p/6331.html上一篇: Use 'class' or 'typename' for template parameters?
下一篇: Storing C++ template function definitions in a .CPP file