孟岩ID:myan
[修改头像]
1552957次访问,排名6好友1人,关注者32
总是在思考存在的问题
myan的文章
原创 146 篇
翻译 0 篇
转载 3 篇
评论 5196 篇
最近评论
lschou520:怎么会忘记印度、日本和欧洲呢?
daijunhua:支持,中华儿女,互相护持地走!
ranzj:我只抱怨自己的努力不够。
ranzj:我毫不怀疑 SilverLight 是个“钱”途无量的玩意儿。
winvc:还有 之前已经看到过一篇署名孟岩的文章了 也是自称学计算机的 在MOP发的文章 题目是《不知名的程序员写给想学编程的朋友》(最后署名前还特别声明了下自己是初中文化全靠自学的 大哥 这样的人全国有几千万 没几个比你这种货色差的)

那文章是看的我想吐 不知道是你还是重名了 不过咋跟你这篇文章风格这么像呢 都是不懂 逻辑混乱 瞎喷
你是自己想不明白问题 但认为自己想……
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes
文章分类
收藏
    相册
    测试
    友情链接
    老赵的博客
    存档

    原创 STL知识准备: 1. C++关键字typename

    新一篇: STL之父访谈录(一万二千字的大块头)

    /*******************************************************************************
     *  SGI*STL是STL之父Alexander Stepanov和STL巨匠Matt Austern等人的作品, 是当今  *
     *  最富盛名、最出色的STL实现版本,全部源代码和说明文档可从www.sgi.com/STL/下  *
     *  载, 是我们学习STL的最佳范本. 但是众所周知, STL使用了大量复杂艰深的C++特性, *
     *  加上STL本身的复杂和庞大, 使得阅读代码本身就成为一件非常困难的工作. 以下文  *
     *  字是我在学习STL过程中得到的一些经验和猜测, 希望能对大家有所帮助, 更希望能  *
     *  得到大家的批评和指正, 以利于我们的共同提高.                                *
     *                                                                      myan   *
     *******************************************************************************/

    在SGI*STL源代码里, typename这个新的C++关键字得使用可以说是随处可见. 很多以前学习过
    C++的人可能还不认识typename, 其实它的常规用法很简单: 在声明模板函数或者模板类时,
    传统的写法:
    template <class T>
    generic_function() {
    //........
    }

    亦可以写成
    template <typename T>
             ------------
    generic_func() {
    //...............
    }
    引入这个关键字主要是为了避免class可能给人带来的混淆.
    本来typename的用法就是这么简单, 但是STL源代码中还有typename的一种不常见的用法, 如果
    不了解, 阅读源代码时就会遇到困难. 因为目前我找不到有关这个问题的说明, 所以自己试验了
    一下, 得到一个猜测, 现简介如下, 请有识之士斧正.

    首先看一段SGI*STL源代码, 摘自stl_iterator.h

    1: template <class _Container, class _Iterator>
    2: inline insert_iterator<_Container> inserter(_Container& __x, _Iterator __i)
    3: {
    4:   typedef typename _Container::iterator __iter;
    5:   return insert_iterator<_Container>(__x, __iter(__i));
    6:  }

    令人费解的部分在第四行. 请大家在看我的解释之前先想一想, 我不敢保证下面解释的正确性和
    全面性.

    解释:
        我认为typename的语义是: 通知编译器, 在typename后面被声明的东西是一个类型, 而不是别的
    什么东西.

    例子:
    // tpname.cpp
    #include <iostream>
    #include <typeinfo>  // for typeid() operator

    using namespace std;

    template <typename TP>
    struct COne {   // default member is public
        typedef TP one_value_type;
    };

    template <typename COne>   // 用一个模板类作为模板参数, 这是很常见的
    struct CTwo {
        // 请注意以下两行
        // typedef COne::one_value_type  two_value_type;   // *1
        typedef typename COne::one_value_type  two_value_type;      // *2 
    };

    // 以上两个模板类只是定义了两个内部的public类型, 但请注意第二个类CTwo的two_value_type类型
    // 依赖COne的one_value_type, 而后者又取决于COne模板类实例化时传入的参数类型.

    int main()
    {
        typedef COne<int> OneInt_type;
        typedef CTwo< OneInt_type > TwoInt_type;
        TwoInt_type::two_value_type i;
        int j;
        if ( typeid(i) == typeid(j) )   // 如果i是int型变量
            cout << "Right!" << endl;   // 打印Right
        return;
    }
    //  ~tpname.cpp

    以上例子在Linux下用G++ 2.91编译通过, 结果打印"Right". 但是如果把*1行的注释号去掉, 注释
    *2行, 则编译时报错, 编译器不知道COne::one_value_type为何物. 通常在模板类参数中的类型到
    实例化之后才会显露真身, 但这个CTwo类偏偏又要依赖一个已经存在的COne模板类, 希望能够预先
    保证CTwo::two_value_type与COne::one_value属于同一类型, 这是就只好请typename出山, 告诉
    编译器, 后面的COne::one_value_type是一个已经存在于某处的类型的名字(type name), 这样编译
    器就可以顺利的工作了.

    发表于 @ 2001年01月12日 22:22:00|评论(loading...)|编辑

    评论

    #键盘歌手 发表于2004-09-09 21:59:00  IP: 218.13.193.*
    1行和2行在MS VC6(SP5)下均可编译通过,并且结果一样:)
    #bm1408 发表于2004-09-21 17:09:00  IP: 218.2.150.*
    我在VC6.0SP2下没有通过!

    在DEVC++下通过!

    正在学习你的BLOG!
    #kirby 发表于2004-10-06 17:23:00  IP: 219.101.214.*
    在VS.NET 2003下编译通不过,非了很大的劲才得到了答案。
    如果早看到你的这篇文章就好了。
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 孟岩