"template <class T>"和"template <typename T>"有什么区别?

hkB*_*sai 12 c++ templates class

可能重复:
对模板参数使用'class'或'typename'?

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

template <class T> class SampleClass1
{
    // ...
};
Run Code Online (Sandbox Code Playgroud)

template <typename T> class SampleClass2
{
    // ...
};
Run Code Online (Sandbox Code Playgroud)

这两个代码有什么区别?

编辑:我将错误的关键字"typedef"更正为"typename".

Cha*_*via 18

如果通过

template <typedef T> class SampleClass2
Run Code Online (Sandbox Code Playgroud)

你的意思是

template <typename T> class SampleClass2
Run Code Online (Sandbox Code Playgroud)

那就没有区别了.使用的classtypename(在是指一种类型的模板的参数的上下文中)是可互换的.

这里允许两个关键字的原因是历史性的.有关详细说明,请参阅此文章.


Ind*_*ant 15

在模板模板参数的情况下

template <typename T, template <typename> class Wrapper>
class Foo {
    //...
  private:
    Wrapper<T> data;
};
Run Code Online (Sandbox Code Playgroud)

你必须在classname之前使用class.这是错的:

template <typename T, template <typename> typename Wrapper>
Run Code Online (Sandbox Code Playgroud)

但这没关系:

template <typename T, template <class> class Wrapper>
Run Code Online (Sandbox Code Playgroud)

在其他情况下,它们是可互换的.