[c++] 模板中关键字'typename'和'class'的区别?



Answers

为了命名模板参数, typenameclass是等价的。 §14.1.2:

模板参数中的类和类型名称之间没有语义上的区别。

然而,在使用模板时, typename在另一个上下文中是可能的 - 向编译器提示您指向依赖类型。 §14.6.2:

除非适用的名称查找找到类型名称或名称由关键字typename限定,否则假定在模板声明或定义中使用的名称取决于模板参数,而不是为类型命名。

例:

typename some_template<T>::some_type

如果没有typename那么编译器通常无法说明您是否指向某个类型。

Question

对于模板,我看到了两个声明:

template < typename T >
template < class T >

有什么不同?

在下面的例子中,这些关键词究竟意味着什么(摘自德国维基百科有关模板的文章)?

template < template < typename, typename > class Container, typename Type >
class Example
{
     Container< Type, std::allocator < Type > > baz;
};



  1. 没有不同
  2. 模板类型参数Container本身是一个具有两个类型参数的模板。



Links