模板编程中typename用法

文章目录

  • 模板编程中typename用法
    • typename的常规用法
    • typename的第二个用法:修饰类型
    • typename使用规则

typename的常规用法

typename在C++类模板或者函数模板中经常使用的关键字,此时作用和class相同,只是定义模板参数;在下面的例子中,该函数实现泛型交换数据,即交换两个数据的内容,数据的类型由_Tp决定。

template <typename _Tp>
inline void swap(_Tp& __a, _Tp& __b)
{_Tp __tmp = __a;__a = __b;__b = __tmp;
}

typename的第二个用法:修饰类型

限定名和非限定名

​ 限定名(qualified name),是限定了命名空间的名称。看下面这段代码,cout和endl是在命名空间std定义的,必须加上std::,使其为std::cout和std::endl,因此称其为限定名。

#include <iostream>int main()
{std::cout << "Hello world!" << std::endl;
}

若在主函数前面使用using namespace std;或者在主函数内使用using std::cout;,然后使用时只用cout和endl,它们的前面不再有空间限定std::,所以此时的cout和endl叫做非限定名(unqualified name)。

#include <iostream>
using namespace std;int main()
{using std::cout;using std::endl;cout << "Hello world!" << endl;
}

依赖名和非依赖名

依赖名(dependent name)是指依赖于模板参数的名称,而非依赖名(non-dependent name)则相反,指不依赖于模板参数的名称。看下面这段代码:

template <class T>
class MyClass
{int i;vector<int> vi;vector<int>::iterator vitr;T t;vector<T> vt;vector<T>::iterator viter;};

因为int是内置类型,前三个定义的类型在声明这个模板类时就已知,叫做非依赖名。然而对于接下来的三行定义,只有在模板实例化时才能知道它们的类型,因为它们都依赖于模板参数T。则T, vector<T>, vector<T>::iterator称为依赖名。

类作用域

在类外部访问类中的名称时,可以使用类作用域操作符,调用通常存在三种:静态数据成员、静态成员函数和嵌套类型:Metadata::value,Metadata::function,Metadata::ValueType;

 class Metadata {static int value;static int function();typedef std::string ValueType;};

下面来看一个例子:

template <class T>
void function()
{T::iterator *iter;.....
}

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

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

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

typename使用规则

typename在下面情况下禁止使用:

  1. 模板定义之外,即typename只能用于模板的定义中
  2. 非限定类型,比如int,vector<int>之类
  3. 基类列表中,比如template <class T> class C1 : T::InterType不能在T::InterType前面加typename
  4. 构造函数的初始化列表中,如果类型是依赖于模板参数的限定名,那么在它之前必须加typename(除非是基类列表,或者在类的初始化成员列表中)。

模板编程中typename用法相关推荐

  1. C++中typename用法

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

  2. 模板类中 typename的用法,以及函数的定义和声明

    typename 的用法: 第一种 template<typename T> 这种大家都知道, 和 template<class T> 一样,就不多讲解了 第二种: 嵌套从属名 ...

  3. C++ 中 typename用法

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

  4. shell编程中date用法(转)

    原文地址:http://blog.sina.com.cn/s/blog_61c006ea0100mgxe.html 1.date --help %% 输出%符号 a literal % %a 当前域的 ...

  5. python3网络编程中semaphore用法_python3 进程信号量semaphore

    #-*- coding: utf-8 -*- importosimporttimefrom multiprocessing importPooldefgo_ktv(i):print("use ...

  6. shell编程中crontab用法超级详解!

    使用crontab你可以在指定的时间执行一个shell脚本或者一系列Linux命令. 时间格式:{minute} {hour} {day-of-month} {month} {day-of-week} ...

  7. C++知识点61——typename与class、模板编程与继承、模板类和友元、类模板与static成员

    一.typename与class的异同 1.啥时候既可以使用typename,又可以使用class? 当表示模板参数的时候,二者没有区别 2.啥时候只能使用typename,不能使用class? 当模 ...

  8. android焦点动画,Android编程中PopupWindow的用法分析【位置、动画、焦点】

    本文实例讲述了Android编程中popupwindow用法.分享给大家供大家参考,具体如下: 在Android中有很多级别的Window,不同级别的Window按照z-index方向分布.下面看看A ...

  9. java编程里的values怎么使用,详解Java编程中super关键字的用法

    这篇文章主要介绍了Java编程中this与super关键字的用法,包括从内存结构方面分析super的作用域,需要的朋友可以参考下 通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程 ...

最新文章

  1. RHEL6基础四十三之RHEL文件共享②Samba简介
  2. python dictwriter_手把手教你写爬虫 |Python 采集大众点评数据采集实战
  3. 关于vue.js element ui 表单验证 this.$refs[formName].validate()的问题
  4. 【图解】java8性能对比_Java 11 究竟比 8 快了多少?
  5. EntityFramwork(1) 源地址https://msdn.microsoft.com/zh-cn/data/jj193542
  6. 基于Matlab的循环码实验报告,基于MATLAB的循环码实验报告
  7. 高端智能阿里手机 黑色 ZOPO C2 出售1499
  8. Boyer-Moore 投票算法
  9. linux设置开机自启 etc rt.d,Linux下禁止服务开机自启动
  10. JavaScript中__proto__与prototype的关系
  11. Atitit 短信验证的漏洞 目录 1.1. APP读取短信 1 1.2. 手机上访问的业务来说,短信验证码就没那么独立了 1 1.3. 短信保管箱” 1 1.4. 自动把短信备份到云端的功能。 2
  12. 一个正经的前端学习 开源 仓库(500)
  13. HUSTOJ随笔3-配置文件
  14. 单片机74LS138扩展中断
  15. 怎么样对阿里云ECS主机进行绑定域名
  16. 论证可行性有哪几个方面
  17. 达梦创建用户无效的用户名报错2101
  18. java组织机构代码验证规则
  19. 出租车GPS数据分析的常规方法
  20. 中国建筑装饰装修——刘昊威设计作品:切尔西·扬画廊

热门文章

  1. 英雄联盟手游测试服服务器维护中,英雄联盟手游再出问题,官方发布通告,这些玩家或将无缘测试服...
  2. 工业树莓派如何保障电气安全?
  3. html怎么把图片做成一条花纹,CSS3 花纹背景图
  4. postgresql: 求和后再求平均值
  5. 基于Android平台的简易计算器,基于Andriod的简易计算器
  6. Probase知识图谱详细介绍
  7. 计算机二级考试数据库,计算机二级数据库考试试题
  8. AppStore 定价策略
  9. html5三维空间效果,基于HTML5的空间环境数据三维成像研究与应用
  10. 2022-2027年中国蓝莓加工行业发展监测及投资战略咨询报告