Skip to content

Latest commit

 

History

History
40 lines (40 loc) · 1.75 KB

rule42.md

File metadata and controls

40 lines (40 loc) · 1.75 KB

了解typename 的双重意义

  • 首先了解typename的第一种含义: 也就是指定模板参数,在这一种含义下typename等价于class,比如:
template<typename T>
template<class T>
  • 可以选择一直使用typename或者class
  • 在讨论第二种含义之前首先明确几种类型:
    • template内出现的名称如何相依与某一个参数(指的就是模板参数列表中的符号(比如上述的T)),称之为从属类型
    • 如果从属名称在class里面呈现嵌套式,我们称之为嵌套从属名称,比如如下代码:
template<typename C>
void for_each(const C& container)
{
    C::const_iterator iter(container.begin());
}
  • 其中的C::const_iterator也就是一种嵌套从属类型,但是在C++中往往不认为C::const_iterator是一种变量而不是一种类型,所以如何指定它为一种类型,这就引出typename的第二种含义,指定某一个嵌套类型为变量的类型而不是一种变量:
template<typename C>
void for_each(const C& container)
{
    typename C::const_iterator iter(container.begin());
}
  • 但是上述情况仍然存在特例: 在类的继承列表和初始化列表中不可以出现typename标记类型名称
template<typename T>
class Son: public Base<T>::Nested {
public:
    Son(T& t): Base<T>::Nested(t) {}
}
  • 有时候还可以使用typedef来简化名称:
typedef typename std::iterator_traits<IterT>::value_type value_type;
  • 总结:
    • 声明template关键字的时候,前缀关键字classtypename可以互换
    • 请使用关键字typename表示嵌套从属类型名称,但是不得在base class lists(基类列)或者member initialization list(成员初始值列表)内以它作为base class修饰符