| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 668 人关注过本帖
标题:关于函数模板
只看楼主 加入收藏
全世界安静
Rank: 2
等 级:论坛游民
帖 子:104
专家分:65
注 册:2012-6-4
结帖率:31.58%
收藏
 问题点数:0 回复次数:6 
关于函数模板
在定义函数模板的时候,请问用<typename T>与使用<class T>有何区别?最好能举例说明,感谢!
搜索更多相关主题的帖子: 最好 
2012-07-03 13:35
lonmaor
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:郑州
等 级:版主
威 望:75
帖 子:2637
专家分:6423
注 册:2007-11-27
收藏
得分:0 
记得书上说过 没区别

从不知道到知道,到知道自己不知道,成长的道路上脚步深深浅浅
2012-07-03 13:56
lonmaor
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:郑州
等 级:版主
威 望:75
帖 子:2637
专家分:6423
注 册:2007-11-27
收藏
得分:0 
实际上可以说没有区别。

按 C++ 标准来说,template<typename T> 用于基础数据类型,typename 指类型名,T 可以取 char int double 等。

template<class T> 用于类,T 可以取任何类。

但是这里有一个问题,结构体应该用 typename 还是 class? 结构体肯定不是基础数据类型,但也不是类。

所以实际情况是,template<class T> 的 T 也可以取基础数据类型,tempate<typename T> 的 T 也可以取类。

但有一个特例,就是当 T 是一个类,而这个类又有子类(假设名为 innerClass) 时,应该用 template<typename>:

typename T::innerClass   myInnerObject;

这里的 typename 告诉编译器,T::innerClass 是一个类,程序要声明一个 T::innerClass 类的对象,而不是声明 T 的静态成员,而 typename 如果换成 class 则语法错误。

以下这篇文章介绍得比较详细:
http://blogs.

我不清楚楼主的水平到了哪一步。
好读书不求甚解,等你整体水平到了某一个层次,很多问题就迎刃而解了,现在说也白说,我也看不懂。

从不知道到知道,到知道自己不知道,成长的道路上脚步深深浅浅
2012-07-03 14:01
全世界安静
Rank: 2
等 级:论坛游民
帖 子:104
专家分:65
注 册:2012-6-4
收藏
得分:0 
回复 3楼 lonmaor
关于在函数模板中定义一个类中类型成员对象,我已经试过了,用<typenamt T>和<class T>都可以实现的,
比方class out
{
 public:
      class inner{}  innerclass;
}
template<tyname T>//这里换成template<class T>是等效的
void func(T t)
{
  T::inner  test;
}
2012-07-03 14:11
specilize
Rank: 4
等 级:业余侠客
帖 子:126
专家分:247
注 册:2011-2-20
收藏
得分:0 
如果要更加细节的比较这两个的话,在很多情况下还是有很大区别的,基本的原则是始终使用typename,至于要详细了解,楼主可以看<<c++ Templates>>5.1节 Keyword typename
2012-07-05 07:04
lxqlyld
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:116
专家分:125
注 册:2012-6-18
收藏
得分:0 
在函数模板参数表中,typename和class可以互换使用,意思相同,他们都可以用来声明同一模板参数表中不同模板类型参数;看起来typename用来声明模板类型参数比class更为直观,因为typename更能清楚的表现它后面的名字是个类型名,但typename被引进C++的时间不长,现在的程序员还是比较习惯用class,同时单词class比typename要短一些,写起来也比较方便,还是少打几个字比较好啊
2012-07-05 08:57
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 4楼 全世界安静
你没有仔细看三楼的说明。他已经指出了在定义模版的时候这两个关键字没有区别。

就我感觉,除了声明类的时候要用关键字 class 以外,其它时候能用 class 的地方大多都能用 typename 替换。但是有 typename 能用而 class 不能用的,这个三楼也指出了。
虽然 c++ 标准在声明模版的时候普遍都用的是关键字 class,但很多重量级的开源代码使的都是 typename。五楼说的“能用 typename 的地方就尽量用 typename”的这个建议我也听说过,楼主可以采纳。
2012-07-14 12:08
快速回复:关于函数模板
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017758 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved