typename用法:

1、在c++模板中,用于类型参数化的关键字
2、内嵌、依赖类型名
注:C++11中, typename用于指明紧跟其后的是个类型

1. 在C++中typename一般用来声明模板的模板参数(template parameter):
   template<typename T> class X;   //T是一个模板参数
   
2.c++内嵌、依赖、类型名

为什么使用typename关键字
那么问题来了,为什么要加上typename关键字?typedef std::vector<T>::size_type size_type;//why not?
实际上,模板类型在实例化之前,编译器并不知道vector<T>::size_type是什么东西,事实上一共有三种可能:静态数据成员
静态成员函数
嵌套类型那么此时typename的作用就在此时体现出来了——定义就不再模棱两可。

首先是两个概念:
   1). qualified name
       例如:std::cout, std::endl;这样含有作用域符号(::)的就是限定名,
       当我们用using声明将cout,endl引入到当前作用域之后就可以直接使用
       这两个名称,这个时候cout,endl就不是限定名了。
   2). dependent name
       dependent name是依赖于模板参数的类型,例如:

 template <typename T> class X {int i;std::vector<int> ivec;std::vector<int>::iterator iter;T type;std::vector<T> tvec;std::vector<T>::iterator titer;
};

前3个成员变量是不依赖于模板参数,所以是non-dependent name,后3个是dependent name,直到实例化该模板的时候才会知道到底是什么类型。


下面来讨论typename的第二种用法。现在假设我们有一个类如下:

template <typename T> class Y
{T::iterator *iter;...
};

我们可能本意是想定义一个迭代器对象,例如我们如果用vector<int>来实例化这个模板,那么iter
   则应该是一个迭代器指针,但是,如果我们用下面这个类来实例化这个模板:

class cType {static int iterator;...
};
/* 那么T::iterator *iter会被编译器解释为两个数相乘。事实上,C++编译器会采用第二种解释方法,即使iterator的确是一个类型名。为了避免这种矛盾,当我们使用qualified dependent name的时候,需要用typename来指出这是一个类型名.即: */template <typename T> class Y
{typename T::iterator *iter;typedef typename T::iterator iterator; //定义了Y::iterator类型名称...
};

typename 指出下面紧跟着的名称是一个类型

1、内嵌是指定义在类名的定义中的。

2、依赖是指依赖于一个模板参数。typename iterator_traits<_InputIter>::difference_type中difference_type依赖于模板参数_InputIter。

3、类型名是指这里最终要指出的是个类型名,而不是变量。
例如iterator_traits<_InputIter>::difference_type完全有可能是类iterator_traits<_InputIter>类里的一个static对象。而且当我们这样写的时候,C++默认就是解释为一个变量的。所以,为了和变量区分,必须使用typename告诉编译器。

总结:T::iterator这种名称,由于iterator具体是类型还是成员变量取决于T的类型实现,所以当我们知道T::iterator是个类型名称时,如果我们要使用这个类型名,前面必须要加typename.

typename紧跟类型的例子:

#include <iostream>
using namespace std;struct MyClass {typedef int SubType;
};template<typename T>
class MyTemp {
public:typename T::SubType* ptr;MyTemp(const decltype(ptr) a) {ptr = a;}void print() {cout << "ptr_value: " << *ptr << endl;}};int main(void) {int a = 10;MyTemp<MyClass> temp(&a);temp.print();return 0;
}

C++中typename用法相关推荐

  1. 模板编程中typename用法

    模板编程中typename用法 文章目录 模板编程中typename用法 typename的常规用法 typename的第二个用法:修饰类型 typename使用规则 typename的常规用法 ty ...

  2. C++ 中 typename用法

    1.typename的常规用法 typename在C++类模板或者函数模板中经常使用的关键字,此时作用和class相同,只是定义模板参数: 2.typename的第二个用法:模板中标明"内嵌 ...

  3. C++(八)——typename用法

    1.typename来源 1.1原因1: 从表面上看,下面模板的参数只支持用户自定义类型,但其实对语言内置类型或者指针调用也支持: template <class T> int compa ...

  4. c++ typename用法

    1. //在C++中typename一般用来声明模板的模板参数(template parameter):    template<typename T> class X;   //T是一个 ...

  5. c++中static_cast用法与uchar/char的区别

    1.c++中static_cast用法 static_cast是指显性类型强制转换,如: int a = static_cast<int>(120.34); 结果为a= 120. 和C语言 ...

  6. 简单介绍Python中异常处理用法

    这篇文章主要给大家分享的是 Python中异常处理用法,为了保证程序的健壮性与容错性,即在遇到错误时候程序不会崩溃,我们需要对异常进行处理,下面来看看文章对此的用法,需要的朋友可以参考一下 为了保证程 ...

  7. 关于OpenCV中常见函数用法总结

    关于OpenCV中常见函数用法总结 一 一般Mat的赋值操作 二 求Mat中的最大值以及最小值 三 randn()函数给图像添加高斯噪声 四 mean()函数的用法 五 系统计时器 六 矩阵之间的四则 ...

  8. java中import用法

    java中import用法 单类型导入(single-type-import),例如import java.io.File; 按需类型导入(type-import-on-demand),例如 impo ...

  9. 一个线程中lock用法的经典实例

    1 /* 2 该实例是一个线程中lock用法的经典实例,使得到的balance不会为负数 3 同时初始化十个线程,启动十个,但由于加锁,能够启动调用WithDraw方法的可能只能是其中几个 4 作者: ...

最新文章

  1. Spark1.0.0 开发环境高速搭建
  2. 非极大值抑制NMS的python实现
  3. 配置PIX515E DMZ的基本方法与故障排除
  4. [zz]Linux操作系统下三种配置环境变量的方法
  5. 不知道的,还以为是555牌香烟
  6. springmvc-实现增删改查
  7. go interface转int_go语言学习总结(三十三)Go泛型编程
  8. php中引入jquery文件_WP模板开发中,怎样给wordpress网站的文章,添加点赞功能?...
  9. python对图片进行裁剪_python利用四个坐标点对图片进行裁剪
  10. aoc显示器2k165hz测试
  11. Swift iOS macOS 如何 Localize StoryBoard,StoryBoard 本地化,添加多语言支持,基于 String
  12. 任务教学法在计算机教学,“任务驱动”教学法在计算机基础教学中的应用
  13. 深入理解计算机系统(2.5)---二进制整数的加、减法运算(重要)
  14. utl raw mysql_oracle中utl_raw
  15. 绘画作品/系统赏析与评论
  16. 零知开发板连接sd、tf卡模块,针脚定义 spi总线的连接方式
  17. 520,看看AI大牛吴恩达和姚期智如何撩妹
  18. Web前端笔记-i标签做小图标以及改源码注意事项
  19. 第000篇 - 一步一步了解区块链技术
  20. 印尼医疗传感器行业调研报告 - 市场现状分析与发展前景预测

热门文章

  1. 〖金融帝国实验室〗(Capitalism Lab)银行和保险攻略(上、中篇)(作者:FCT小组)
  2. 第8章第37节:完成人才引进计划幻灯片的制作 [PowerPoint精美幻灯片实战教程]
  3. USACO 2004 MooFest 奶牛集会
  4. 行尸走肉android手机版下载地址,行尸走肉无人之地手机版下载_行尸走肉无人之地手机版安卓下载2021_求知软件网...
  5. xen系统安装服务器,citrix Xen-Server安装方法
  6. 图片类库 Thumbnails 详解
  7. 放蛋糕,字符串转换成整数
  8. 汽配行业PLM方案建议书
  9. 使用微信内置浏览器预览图片
  10. 【思维导图】Java基础笔记整理