C++ typedef typename 作用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kwinway/article/details/80688430

更新: 感觉下列文章分析还是模棱两可,这里举一个更直观的例子

template <typename T>
void D<T>::func(T &c)
{
  //这条语句是size_type的静态变量和p相乘
  //还是声明一个size_type类型的指针?
  T::size_type * p;
  //所以使用 typename 声明这是一个类型
  typename T::size_type *p;
}

出处 https://blog.csdn.net/zhangxiao93/article/details/50569924

C++ typedef typename 作用

C++的一些语法让人看着费解,其中就有:

typedef typename std::vector<T>::size_type size_type;

详见《C++ Primer》(第五版)P584
有些不懂的语法有时候虽然知道大概是什么意思,忽略一下就过了其实,不过心里老是膈应,就刨根问底一次吧。


vector::size_type

明白上述语法,首先要先看清vector::size_type的意思。参考《STL源码剖析》不难发现,其实:

template <class T,class Alloc=alloc>
class vector{
public:
    //...
    typedef size_t size_type;
    //...
};

这样就看得很清晰了,vector::size_type是vector的嵌套类型定义,其实际等价于 size_t类型。
也就是说:

vector<int>::size_type ssize;
//就等价于
size_t ssize;

为什么使用typename关键字
那么问题来了,为什么要加上typename关键字?

typedef std::vector<T>::size_type size_type;//why not?

实际上,模板类型在实例化之前,编译器并不知道vector::size_type是什么东西,事实上一共有三种可能:

  • 静态数据成员
  • 静态成员函数
  • 嵌套类型

那么此时typename的作用就在此时体现出来了——定义就不再模棱两可。

总结
所以根据上述两条分析,

typedef typename std::vector<T>::size_type size_type;

语句的真是面目是:
typedef创建了存在类型的别名,而typename告诉编译器std::vector::size_type是一个类型而不是一个成员。

参考:

  1. http://stackoverflow.com/questions/20674738/how-to-use-typename-in-c
  2. http://feihu.me/blog/2014/the-origin-and-usage-of-typename/

typedef typename有什么作用??

02-14

摘自STL源码剖析。rn3.6 iterator 源码完整重列rn由于讨论次序的缘故,先前所列的源码切割散落,有点凌乱。以㆘重新列出SGI STLrn 表头档内与本章相关的程序代码。该表头档还有其他内容,是rn关于iostream iterators、inserter iterators 以及reverse iterators 的实作,将于第8 章rn讨论。rn[code=C/C++]rn// 节录自SGI STL rn// 五种迭代器类型rnstruct input_iterator_tag ;rnstruct output_iterator_tag ;rnstruct forward_iterator_tag : public input_iterator_tag ;rnstruct bidirectional_iterator_tag : public forward_iterator_tag ;rnstruct random_access_iterator_tag : public bidirectional_iterator_tag ;rn// 为避免写码时挂㆒漏万,自行开发的迭代器最好继承自㆘面这个std::iteratorrntemplate rnstruct iterator rntypedef Category iterator_category;rntypedef T value_type;rntypedef Distance difference_type;rntypedef Pointer pointer;rntypedef Reference reference;rn;rn// 「榨汁机」traitsrntemplate rnstruct iterator_traits rntypedef typename Iterator::iterator_category iterator_category;rntypedef typename Iterator::value_type value_type;rntypedef typename Iterator::difference_type difference_type;rntypedef typename Iterator::pointer pointer;rntypedef typename Iterator::reference reference;rn;rn// 针对原生指标(native pointer)而设计的traits 偏特化版。rntemplate rnstruct iterator_traits rntypedef random_access_iterator_tag iterator_category;rntypedef T value_type;rntypedef ptrdiff_t difference_type;rntypedef T* pointer;rntypedef T& reference;rn;rn//下面是我加来测试的,发现编译器提示,error-type;rn//我打开VS中的源码发现不是这么用的。rn//VS中是typedef一个类型 然后用新声明的类型typedef typename; rnint main()rnrn iterator_traits::difference_type d;rnrn[/code]rn

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭