注册 登录
编程论坛 C++教室

关于函数模板

全世界安静 发布于 2012-07-03 13:35, 671 次点击
在定义函数模板的时候,请问用<typename T>与使用<class T>有何区别?最好能举例说明,感谢!
6 回复
#2
lonmaor2012-07-03 13:56
记得书上说过 没区别
#3
lonmaor2012-07-03 14:01
实际上可以说没有区别。

按 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.

我不清楚楼主的水平到了哪一步。
好读书不求甚解,等你整体水平到了某一个层次,很多问题就迎刃而解了,现在说也白说,我也看不懂。
#4
全世界安静2012-07-03 14:11
回复 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;
}
#5
specilize2012-07-05 07:04
如果要更加细节的比较这两个的话,在很多情况下还是有很大区别的,基本的原则是始终使用typename,至于要详细了解,楼主可以看<<c++ Templates>>5.1节 Keyword typename
#6
lxqlyld2012-07-05 08:57
在函数模板参数表中,typename和class可以互换使用,意思相同,他们都可以用来声明同一模板参数表中不同模板类型参数;看起来typename用来声明模板类型参数比class更为直观,因为typename更能清楚的表现它后面的名字是个类型名,但typename被引进C++的时间不长,现在的程序员还是比较习惯用class,同时单词class比typename要短一些,写起来也比较方便,还是少打几个字比较好啊
#7
pangding2012-07-14 12:08
回复 4楼 全世界安静
你没有仔细看三楼的说明。他已经指出了在定义模版的时候这两个关键字没有区别。

就我感觉,除了声明类的时候要用关键字 class 以外,其它时候能用 class 的地方大多都能用 typename 替换。但是有 typename 能用而 class 不能用的,这个三楼也指出了。
虽然 c++ 标准在声明模版的时候普遍都用的是关键字 class,但很多重量级的开源代码使的都是 typename。五楼说的“能用 typename 的地方就尽量用 typename”的这个建议我也听说过,楼主可以采纳。
1