C++中的typename和class完全一样吗?

原创 2007年09月21日 20:12:00

  在模板中,定义模板类型template<class T>和template<typename T>都是一样的。C++书上说,因为template里面的class和类定义class名字有重合,为了防止歧义,引入typename来取代template中的class。但是,typename并不完全等于class的作用。typename还有一个作用。下面以STL中的源码

   在STL中的map源代码文件中,看到map的如下定义: 

 

template<class _Kty,
    
class _Ty,
    
class _Pr = less<_Kty>,
    
class _Alloc = allocator<pair<const _Kty, _Ty> > >
    
class map
        : 
public _Tree<_Tmap_traits<_Kty, _Ty, _Pr, _Alloc, false> >
    
...{    // ordered red-black tree of {key, mapped} values, unique keys
public:
    typedef map
<_Kty, _Ty, _Pr, _Alloc> _Myt;
    typedef _Tree
<_Tmap_traits<_Kty, _Ty, _Pr, _Alloc, false> > _Mybase;
    typedef _Kty key_type;
    typedef _Ty mapped_type;
    typedef _Ty referent_type;    
// retained
    typedef _Pr key_compare;
    typedef typename _Mybase::value_compare value_compare;
    typedef typename _Mybase::allocator_type allocator_type;
    typedef typename _Mybase::size_type size_type;
    typedef typename _Mybase::difference_type difference_type;
    typedef typename _Mybase::pointer pointer;
    typedef typename _Mybase::const_pointer const_pointer;
    typedef typename _Mybase::reference reference;
    typedef typename _Mybase::const_reference const_reference;
    typedef typename _Mybase::iterator iterator;
    typedef typename _Mybase::const_iterator const_iterator;
    typedef typename _Mybase::reverse_iterator reverse_iterator;
    typedef typename _Mybase::const_reverse_iterator
        const_reverse_iterator;
    typedef typename _Mybase::value_type value_type;
....

 这里,可以看到,typedef typename _Mybase::value_compare value_compare来定义一个变量类型。那么这个value_compare的类型来源于_Mybase::value_compare,而这里typename就是指明,这个_Mybase::value_compare是一个类型,而不是一个成员变量。

 

 

 

 

STL pair make_pair简单使用

今天再看《c++标准库》,遇到了以前貌似有点印象的pair,特意记录下来,免得以后忘记了。下面是在vs查看pair定义的一部分代码(貌似很多,只贴一部分) template class _Ty2> s...

Why C++ Supports typename and class.txt

  • 2010年12月17日 14:57
  • 6KB
  • 下载

C++模板中关键字typename与class的区别

在C++里,不管是模板函数,还是模板类,均会用关键字typename和class来指定模板类型。对于模板函数与模板类的使用请自行参考:C++ Primer中文版 。 但是为什么要用两个关键字呢,...
  • leiych
  • leiych
  • 2013年06月06日 22:18
  • 1199

Why C++ Supports both Class and Typename for Type Parameters

Recently, someone asked me why we support both class and typename within C++ to indicate a type para...
  • eijnew
  • eijnew
  • 2012年03月21日 14:50
  • 1235

C++中template<class T> && template <typename T>(模板区分)

问题:在下面的 template declarations(模板声明)中 class 和 typename 有什么不同?  template class Widget; // use...

关于C++中模板中的typename和class的区别比较

C++箴言:理解typename的两个含义 问题:在下面的 template declarations(模板声明)中 class 和 typename 有什么不同? template ...

C++中typename和class在声明模板时的区别

问题在下面的 template declarations(模板声明)中 class 和 typename 有什么不同?template class Widget; // uses "class" te...
  • gatieme
  • gatieme
  • 2016年03月21日 14:21
  • 1887

TypeName 与 class (C++)

"typename"是一个C++程序设计语言中的关键字。当用于泛型编程时是另一术语"class"的同义词。 这个关键字用于指出模板声明(或定义)中的非独立性名称(dependent names)是类型...

C++中的class和typename

**在C++ template中经常会出现两个关键字,那就是typename和class . 在很多时候好想typename和class可以替换,但他们并不是完全相同的 。 class应给是大家用的比...

理解C++typename与class在模版中的使用

一、typename和class在声明类模板参数或者函数模版参数时,代表的意义是相同的。通常情况下,如果模版的参数要求是class类型(用户自定义类型-user defined type)使用clas...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++中的typename和class完全一样吗?
举报原因:
原因补充:

(最多只允许输入30个字)