我看到两个不同的模板类声明:
template <class T> class SampleClass1
{
// ...
};
和
template <typename T> class SampleClass2
{
// ...
};
这两个代码有什么区别?
编辑:我将错误的关键字“typedef”更正为“typename”。
答案 0 :(得分:18)
如果通过
template <typedef T> class SampleClass2
你的意思是
template <typename T> class SampleClass2
然后没有区别。使用class
和typename
(在引用类型的模板参数的上下文中)是可以互换的。
这里允许这两个关键字的原因是历史性的。有关详细说明,请参阅this article。
答案 1 :(得分:15)
如果是模板模板参数
template <typename T, template <typename> class Wrapper>
class Foo {
//...
private:
Wrapper<T> data;
};
您必须在classname之前使用 class 。 这是错的:
template <typename T, template <typename> typename Wrapper>
但是没关系:
template <typename T, template <class> class Wrapper>
在其他情况下,它们是可以互换的。