转:https://blog.csdn.net/zhangxiao93/article/details/50569924

and GOOD: https://blog.csdn.net/vanturman/article/details/80269081

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

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

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

template <class T,class Alloc=alloc>
class vector{
public:
//...
typedef size_t size_type;
//...
};
1
2
3
4
5
6
7
这样就看得很清晰了,vector::size_type是vector的嵌套类型定义,其实际等价于 size_t类型。
也就是说:

vector<int>::size_type ssize;
//就等价于
size_t ssize;
1
2
3
为什么使用typename关键字
那么问题来了,为什么要加上typename关键字?

typedef std::vector<T>::size_type size_type;//why not?
1
实际上,模板类型在实例化之前,编译器并不知道vector<T>::size_type是什么东西,事实上一共有三种可能:

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

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

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

typedef typename std::vector<T>::size_type size_type;
1
语句的真是面目是:
typedef创建了存在类型的别名,而typename告诉编译器std::vector<T>::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/
---------------------
作者:NearXDU
来源:CSDN
原文:https://blog.csdn.net/zhangxiao93/article/details/50569924
版权声明:本文为博主原创文章,转载请附上博文链接!

【转】C++ typedef typename 作用的更多相关文章

  1. C++ typedef typename 作用

    C++ typedef typename 作用 C++的一些语法让人看着费解,其中就有: typedef typename std::vector<T>::size_type size_t ...

  2. C++中的typedef typename 作用

    今天在代码里看到了这样一段代码: typedef typename RefBase::weakref_type weakref_type; 起初一直搞不懂为什么要加个typename,后来搜索了一下才 ...

  3. typedef typename的用法

    我自己最后在这篇文章里理解:[C++]typedef typename什么意思? typedef typename A::a_type b_type; 其中typename是告诉编译器A::a_typ ...

  4. C++ typedef typename

    [cpp] view plaincopy template<typename T> class A { public: typedef T a_type; }; template<t ...

  5. typedef typename

    所以根据上述两条分析,  typedef typename RefBase::weakref_type weakref_type; 语句的真是面目是: typedef创建了存在类型的别名,而typen ...

  6. C语言复习(六)----typedef 的作用

    typedef的作用 重命名变量:typedef unsigned int Uint;//可以使用Uint代替unsigned int 定义新的数据类型 typedef struct Books{ c ...

  7. C++之typename和typedef关键字

    1. typename的作用 template <typename Distance> class KDTreeIndex : public NNIndex<Distance> ...

  8. typedef和typename关键字

    .类型说明typedef 类型说明的格式为: typedef 类型 定义名; 类型说明只定义了一个数据类型的新名字而不是定义一种新的数据类型.定义名表示这个类型的新名字. 例如: 用下面语句定义整型数 ...

  9. C++中typename和class的区别

    C++中typename和class的区别 在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢? 相信学习C++的人对c ...

随机推荐

  1. NLP 基于kashgari和BERT实现中文命名实体识别(NER)

    准备工作,先准备 python 环境,下载 BERT 语言模型 Python 3.6 环境 需要安装kashgari Backend pypi version desc TensorFlow 2.x ...

  2. Python爬虫之简单爬虫框架实现

    简单爬虫框架实现 目录 框架流程 调度器url管理器 网页下载器 网页解析器 数据处理器 具体演示效果 框架流程 调度器 #导入模块 import Url_Manager import parser_ ...

  3. MySQL5.5配置文件my.ini详解

    [client]port = 3306 [mysqld]port = 3306 ##安装目录 basedir="C:/Program Files (x86)/MySQL/MySQL Serv ...

  4. Linux配置iSCSI存储

    1.基础知识 1.1 存储相关     直接存储(DAS):例如本机上的磁盘,就是属于直接存储设备.     存储区域网络(SAN):来自网络内的其他存储设备提供的磁盘.Iscsi就是属于该方式.   ...

  5. vi 纵向模式编辑

    Vim 的纵向编辑模式 vim解读 vi解读 批量删除# 技巧: r 进入修改模式 I 进入行首插入模式 A 进入行尾插入模式 r替换 I前前添加 A后添加 1.多行注释: a. 按下Ctrl + v ...

  6. Laying out a webpage is easy with flex

    Flex写起来省劲很多,只用加上flex-wrap:wrap在container上.Html5 playground

  7. SELinux 对nginx访问目录的影响

    centos新装的系统,用yum 安装的nginx . 因用yum 安装的nginx 默认目录在/usr下面. 当SELinux开启时,将会禁止访问设置在其他路径下的地址.比如我设置server 中 ...

  8. R 语言中的多元线性回归

    示例 sessionInfo() # 查询版本及系统和库等信息 # 工作目录设置 getwd() path <- "E:/RSpace" setwd(path) rm(lis ...

  9. The Preliminary Contest for ICPC Asia Nanchang 2019 B. Fire-Fighting Hero

    题目:https://nanti.jisuanke.com/t/41349 思路:dijkstra最短路径 先以 fire-fighting hero为起点 跑一遍dijkstra 建立 起点 p 并 ...

  10. Iview 在Table组件中添加图片

    要先简单了解render函数的使用. 直接上代码: { title: "商品图片", key: "commodityPhoto", align: 'center ...