区别


基本上来说,class和typename几乎没有区别。在可以使用class的地方都可以使用typename,在使用typename的地方也几乎可以使用class。

可以看出我加黑了两个子:几乎,这说明二者还是有一定区别的。先看下面的代码:

template <class T> class Collection
{
public:
bool contains(T a); private:
vector <T> object;
};

以上代码定义了一个模板类Collection,包含似有变量为object,包含一个方法contains用于判断某元素是否在object中。我实现contains方法的基本思路是:遍历整个vector,将每个元素与a进行比较。于是我写下了以下代码:

template <class T> bool Collection<T>::contains(T a)
{
vector<T>::iterator it = object.begin();
for(; it != object.end(); ++it)
{
if(a == *it)
return true;
}
return false;
}

将上面的代码进行编译就知道,这是错的。错误开源在于,我已经假设vector::iterator是一个type,也即上面代码的第3行我默认是在定义一个vector::iterator类型的变量it,但是事实上,对于未知的类型T,编译器无法确定vector::iterator是一个类型。这个时候必须使用一个关键词typename对其进行描述,明确告诉编译器这是一个类型(type)。

如果解析器在一个 template(模板)中遇到一个 nested dependent name(嵌套依赖名字),它假定那个名字不是一个 type(类型),除非你用其它方式告诉它。缺省情况下,nested dependent name(嵌套依赖名字)不是 types(类型)。

一句话总结


模板定义中,在使用class的地方使用typename都是可以的,但是有的地方必须使用typename而不能使用class(上述情况),因此在编码中尽量使用typename是安全的。

最新文章

  1. 创建第一个 local network(II)- 每天5分钟玩转 OpenStack(81)
  2. Java 深拷贝、浅拷贝及Cloneable接口
  3. (原创)解决远程桌面连接远程应用时,出现 &#39;应用程序错误: &#39;0x7c931780&#39;指令引用的 &#39;0x89abcdef&#39; 内存。该内存不能为 &#39;read&#39;&quot;
  4. 搞笑的u盘图片
  5. JavaScript自定义右键菜单
  6. 【练习】增加日志组数至4组,且每组日志成员大小为50M,每组2个成员。
  7. $(document).ready()与 window.onload执行时机
  8. 远程连接MySql连不上1130
  9. python 语句,条件,循环
  10. plot的实践。
  11. OpenWrt简要刷机教程
  12. 插件的理解$.extend()与$.fn.extend()
  13. Android L(5.0)源码之图形与图像处理之动画——Frame、Tween、属性动画、SurfaceView
  14. JS 基础学习随想
  15. Python之面向对象一
  16. 阅读 video in to axi4-stream v4.0 笔记
  17. Python __slots__的使用
  18. centos 虚拟环境 安装mezzanine cms
  19. REST风格的应用程序实现
  20. python中for、while循环、if嵌套的使用

热门文章

  1. chrome emulator use-agent 设置 chrom模拟手机客户端
  2. 动态链接--so的搜索过程
  3. 6 种CSS设置居中的方法
  4. Flex 舞台背景渐变
  5. center os 6.5 vsftpd 登陆出现 530 错误拒绝 解决方法
  6. git强制覆盖本地文件
  7. CentOS7安装telnet服务
  8. listView divider marginLeft marginRight
  9. cocos2d-x 判断两条直线是否相交
  10. Java常见排序算法之直接插入排序