【转】C++ typedef typename 作用
转: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 作用的更多相关文章
- C++ typedef typename 作用
C++ typedef typename 作用 C++的一些语法让人看着费解,其中就有: typedef typename std::vector<T>::size_type size_t ...
- C++中的typedef typename 作用
今天在代码里看到了这样一段代码: typedef typename RefBase::weakref_type weakref_type; 起初一直搞不懂为什么要加个typename,后来搜索了一下才 ...
- typedef typename的用法
我自己最后在这篇文章里理解:[C++]typedef typename什么意思? typedef typename A::a_type b_type; 其中typename是告诉编译器A::a_typ ...
- C++ typedef typename
[cpp] view plaincopy template<typename T> class A { public: typedef T a_type; }; template<t ...
- typedef typename
所以根据上述两条分析, typedef typename RefBase::weakref_type weakref_type; 语句的真是面目是: typedef创建了存在类型的别名,而typen ...
- C语言复习(六)----typedef 的作用
typedef的作用 重命名变量:typedef unsigned int Uint;//可以使用Uint代替unsigned int 定义新的数据类型 typedef struct Books{ c ...
- C++之typename和typedef关键字
1. typename的作用 template <typename Distance> class KDTreeIndex : public NNIndex<Distance> ...
- typedef和typename关键字
.类型说明typedef 类型说明的格式为: typedef 类型 定义名; 类型说明只定义了一个数据类型的新名字而不是定义一种新的数据类型.定义名表示这个类型的新名字. 例如: 用下面语句定义整型数 ...
- C++中typename和class的区别
C++中typename和class的区别 在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢? 相信学习C++的人对c ...
随机推荐
- hadoop上hive的安装
1.前言 说明:安装hive前提是要先安装hadoop集群,并且hive只需要再hadoop的namenode节点集群里安装即可(需要再所有namenode上安装),可以不在datanode节点的机器 ...
- CentOS MySql5.6编译安装
生产环境中,mysql服务器上边最好什么服务都不要再安装!!! 一.准备工作: # yum -y install make gcc-c++ cmake bison-devel ncurses-deve ...
- redis一键部署脚本
1.新建一个名为 auto_install_redis.sh的文件 2.将下面脚本拷贝到文件中,具体步骤在注释里面 #环境 linux #一键安装redis,在linux环境中使用脚本运行该文件(sh ...
- 【异常】Reason: Executor heartbeat timed out after 140927 ms
1 详细异常 ERROR scheduler.JobScheduler: Error running job streaming job ms. org.apache.spark.SparkExcep ...
- SSD学习笔记
目标检测算法——SSD:Single Shot MultiBox Detector,是一篇非常经典的目标检测算法,十分值得阅读和进行代码复现,其论文地址是:https://arxiv.org/abs/ ...
- 代码报错--------EOFError: Compressed file ended before the end-of-stream marker was reached
背景:运行LeNet识别CIFAR-10的图像的代码时,报错: EOFError: Compressed file ended before the end-of-stream marker was ...
- glViewport函数用法
一. 其函数原型为glViewport(GLint x,GLint y,GLsizei width,GLsizei height) x,y 以像素为单位,指定了窗口的左下角位置. width,heig ...
- 权限和ACL访问控制 -01-权限
权限位 rwxrwrwx:左三位:定义user(owner)的权限,属主权限中三位:定义group的权限,属组权限有三位:定义other的权限,其他的权限 进程对文件的访问权限应用模型:进程的属主与文 ...
- 使用sql做迁移矩阵
在数据分析数据差异的时候 经常用到一个图叫做迁移矩阵. 其中里面的值可以是数量也可以是百分比,我们可以从一个时间点明确的看到在另一个时间点或者另一个时间点 子类之间数量迁移. 比如这次我在公司与业务核 ...
- 绑定与非绑定方法及反射,isinstance和issubclass内置函数
目录 绑定方法与非绑定方法 1.绑定方法 2.非绑定方法(staticmethod) isinstance和issubclass 内置函数 1.isinstance 2.issubclass 反射(面 ...