`
hongbochen1223
  • 浏览: 43787 次
文章分类
社区版块
存档分类
最新评论

typename与class的区别

 
阅读更多

我们都知道,在STL中基本上都使用了模板类的声明,即template。在模板类的声明中,我们有两种方式:

template <class T>
template <typename T>

在这里,class和typename是相同的。也就是说,在声明一个template type parameter(模板类型参数)的时候,class和typename意味着
完全相同的东西。

但是,在C++中,有的时候必须要使用typename.下面我们列举下面一个例子。

关键字typename被用来作为型别之前的标识符号。

template <class T>
class MyClass{
    typename T::SubType * ptr;
    ...
};

在这里,typename指出SubType是class T中定义的一个类别,因此ptr是一个指向T::SubType型别的指针。如果没有关键字typename,SubType会被当成一个static成员,于是

T::SubType * ptr

会被解释为型别T内的数值SubType与ptr的乘积。

SubType成为一个型别的条件是,任何一个用来取代T的型别,其内部必须有一个内部型别(inner type)SubType的定义。例如,将型别Q当作template的参数。
MyClass x;

必要条件是型别Q有如下的内部型别定义:

class Q{
    typedef int SubType;
    ...
};

因此,MyClass的ptr成员应该变成一个指向int型别的指针,子型别SubType也可以成为抽象
数据型别(例如,class):

class Q{
    class SubType;
    ...
};

注意,如果要把一个template中的某个标识符号指定为一种型别,就算是意图显而易见,关键字typename也是不能省略的,因此C++的一般规则是,除了使用typename修饰之外,template内的任何标识符号都被视为一个值而不是一个型别。

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    阅读材料-C++ 模板中的typename、class关键字.rar_C++ typename_class

    C++ Template中的typename、class关键字,模板中关键字的class与typename的作用

    c++中typename和class的区别介绍

    在c++Template中,很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢?

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

    中我们来谈一谈C++的template模板中class与typename关键字的区别分析,同时会讲到嵌套从属名称时的一些注意点,需要的朋友可以参考下

    深入理解c++模板中的class与typename

    在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢?下面这篇文章主要给大家介绍了关于c++模板中class与typename的相关资料,需要的朋友可以参考下。

    Why C++ Supports typename and class.txt

    不错的关于c++中typedef和class的使用说明

    C++ 类模板和模板类的深入解析

    1、在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢?  答:class用于定义类,在模板...在模板定义语法中关键字class与typename的作用完全一样。  

    详解C++的模板中typename关键字的用法

    typename的使用场合 用处1, 用在模板定义里, 标明其后的模板参数是类型参数。 例如 template&lt;typename&gt; T foo(const T& t, const Y& y){//....}; templace&lt;typename&gt; class CTest { private: T t; public: //......

    cpp代码-模板 泛型 template<typename> template<class>

    cpp代码-模板 泛型 template&lt;typename&gt; template&lt;class&gt;

    C++类模板与模板类深入详解

    1、在c++的Template中很多地方都用到了typename与class这两个关键字,而且有时候二者可以替换,那么是不是这两个关键字完全一样呢? 事实上class用于定义类,在...在模板定义语法中关键字class与typename的作用完全一

    详解C++ 模板编程

    类型模板 类型模板包括函数模板和类模板,基本上是C++开发人员接触...类型模板以template开始声明,尖括号内的typename关键字可用class替代。类型模板中typename和class具有相同含义,均表示参数类型。实践中typename

    Advanced Metaprogramming in Classic C++

    The classic C++ language admits two basic types of templates—function templates and class templates2: Here is a function template: template &lt;typename scalar_t&gt; scalar_t sq(const scalar_t& x) { return...

    高速对象池(内存池)类模板代码(C++)

    template&lt;class TT, bool val&gt;struct ChangeClass {typedef typename TT Type;}; template&lt;class TT&gt;struct ChangeClass,false&gt; {typedef typename std::vector*&gt; Type;}; 然后代码中的 typedef typename LK::...

    C++使用模板实现单链表

    template&lt;typename&gt; class CLink; template&lt;typename&gt; class Node { friend class CLink; public: /* 构造函数和析构函数一般不加类型参数 本类类中除了构造函数和析构函数以外 其它的地方都要加上类型参数 */...

    SGI-STL 源码以及 word 注解版

    template &lt;class InputIterator1, class InputIterator2, class BinaryPredicate&gt; pair, InputIterator2&gt; mismatch (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate ...

    数据结构实验代码 包括链表、二叉排序树等……

    class Stack{ struct Node{ Item data; Node* next; }; Node* pTop; public: Stack(); ~Stack(); void push(Item x); Item pop(); Item top(); bool isEmpty(); }; template&lt;typename Item&gt; Stack...

Global site tag (gtag.js) - Google Analytics