【问题标题】:What is the difference between "template <class T>" and "template <typename T>"? [duplicate]“模板<class T>”和“模板<typename T>”有什么区别? [复制]
【发布时间】:2011-05-30 21:03:24
【问题描述】:

可能重复:
Use 'class' or 'typename' for template parameters?

我看到两个不同的模板类声明:

template <class T> class SampleClass1
{
    // ...
};

template <typename T> class SampleClass2
{
    // ...
};

这两个代码有什么区别?

编辑:我将错误的关键字“typedef”更正为“typename”。

【问题讨论】:

  • 区别在于第一个是正确的,而第二个是不正确的。第二个用typename代替typedef,那么就没有区别了!
  • @Nawaz:是的,很抱歉关键字错误。

标签: c++ templates class


【解决方案1】:

如果通过

template <typedef T> class SampleClass2

你是说

template <typename T> class SampleClass2

那么没有区别。 classtypename(在引用类型的模板参数的上下文中)的使用是可以互换的。

此处允许使用两个关键字的原因是历史原因。详细解释见this article

【讨论】:

    【解决方案2】:

    如果是模板模板参数

    template <typename T, template <typename> class Wrapper>
    class Foo {
        //...
      private:
        Wrapper<T> data;
    };
    

    你必须在类名之前使用 class。 这是错误的:

    template <typename T, template <typename> typename Wrapper>
    

    但这没关系:

    template <typename T, template <class> class Wrapper>
    

    在其他情况下,它们可以互换。

    【讨论】:

    • 更新:C++ 标准化小组中有一个新提案可以消除这种差异。 N4051:允许在模板模板参数中使用 typename—Richard Smith
    猜你喜欢
    • 2019-07-30
    • 2013-04-05
    • 2021-10-29
    • 2020-09-15
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    相关资源
    最近更新 更多