使用'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