详解C++的模板中typename关键字的用法
typename的使用场合 template<typename T,typename Y> T foo(const T& t,const Y& y){//....}; templace<typename T> class CTest { private: T t; public: //... } 其实,这里最常用的是使用关键字class,而且二者功能完全相同,这里的class和定义类时的class完全是两回事,C++当时就是为了减少关键字,才使用了class。但最终却不得不引入了typename,究竟是 template <class _InputIter,class _Tp> typename iterator_traits<_InputIter>::difference_type count(_InputIter __first,_InputIter __last,const _Tp& __value) { __STL_REQUIRES(_InputIter,_InputIterator); __STL_REQUIRES(typename iterator_traits<_InputIter>::value_type,_EqualityComparable); __STL_REQUIRES(_Tp,_EqualityComparable); typename iterator_traits<_InputIter>::difference_type __n = 0; for ( ; __first != __last; ++__first) if (*__first == __value) ++__n; return __n; } 这里有三个地方用到了typename:返回值、参数、变量定义。分别是: typename iterator_traits<_InputIter>::difference_type typename iterator_traits<_InputIter>::value_type typename iterator_traits<_InputIter>::difference_type __n = 0; difference_type, value_type就是依赖于_InputIter(模板类型参数)的类型名。源码如下: template <class _Iterator> struct iterator_traits { typedef typename _Iterator::iterator_category iterator_category; typedef typename _Iterator::value_type value_type; typedef typename _Iterator::difference_type difference_type; typedef typename _Iterator::pointer pointer; typedef typename _Iterator::reference reference; }; 内嵌是指定义在类名的定义中的。以上difference_type和value_type都是定义在iterator_traits中的。 template<class T> class Derived: public Base<T>::XXX { ... } (2)类模板定义中的初始化列表。 Derived(int x) : Base<T>::xxx(x) { ... } 为什么这里不需要呢?因为编译器知道这里需要的是类型还是变量,(1)基类列表里肯定是类型名,(2)初始化列表里肯定是成员变量名。 typename和class的区别 template<typename T>...... class MyArray { public: typedef int LengthType; ..... } template<class T> void MyMethod( T myarr ) { typedef typename T::LengthType LengthType; LengthType length = myarr.GetLength; } 这个时候typename的作用就是告诉c++编译器,typename后面的字符串为一个类型名称,而不是成员函数或者成员变量,这个时候如果前面没有 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |