⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 csdn_文档中心_stl知识准备 1_ c++关键字typename.htm

📁 csdn10年中间经典帖子
💻 HTM
📖 第 1 页 / 共 2 页
字号:
            因为目前我找不到有关这个问题的说明, 所以自己试验了<BR>一下, 得到一个猜测, 现简介如下, 请有识之士斧正.</P>
            <P>首先看一段SGI*STL源代码, 摘自stl_iterator.h</P>
            <P>1: template &lt;class _Container, class _Iterator&gt;<BR>2: 
            inline insert_iterator&lt;_Container&gt; inserter(_Container&amp; 
            __x, _Iterator __i)<BR>3: {<BR>4:&nbsp;&nbsp; typedef typename 
            _Container::iterator __iter;<BR>5:&nbsp;&nbsp; return 
            insert_iterator&lt;_Container&gt;(__x, __iter(__i));<BR>6:&nbsp; 
            }</P>
            <P>令人费解的部分在第四行. 请大家在看我的解释之前先想一想, 我不敢保证下面解释的正确性和<BR>全面性.</P>
            <P>解释: <BR>&nbsp;&nbsp;&nbsp; 我认为typename的语义是: 通知编译器, 
            在typename后面被声明的东西是一个类型, 而不是别的<BR>什么东西.</P>
            <P>例子:<BR>// tpname.cpp<BR>#include &lt;iostream&gt;<BR>#include 
            &lt;typeinfo&gt;&nbsp; // for typeid() operator</P>
            <P>using namespace std;</P>
            <P>template &lt;typename TP&gt;<BR>struct COne {&nbsp;&nbsp; // 
            default member is public<BR>&nbsp;&nbsp;&nbsp; typedef TP 
            one_value_type;<BR>};</P>
            <P>template &lt;typename COne&gt;&nbsp;&nbsp; // 用一个模板类作为模板参数, 
            这是很常见的<BR>struct CTwo {<BR>&nbsp;&nbsp;&nbsp; // 
            请注意以下两行<BR>&nbsp;&nbsp;&nbsp; // typedef COne::one_value_type&nbsp; 
            two_value_type;&nbsp;&nbsp; // *1<BR>&nbsp;&nbsp;&nbsp; typedef 
            typename COne::one_value_type&nbsp; 
            two_value_type;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // *2&nbsp; <BR>};</P>
            <P>// 以上两个模板类只是定义了两个内部的public类型, 但请注意第二个类CTwo的two_value_type类型<BR>// 
            依赖COne的one_value_type, 而后者又取决于COne模板类实例化时传入的参数类型.</P>
            <P>int main()<BR>{<BR>&nbsp;&nbsp;&nbsp; typedef COne&lt;int&gt; 
            OneInt_type;<BR>&nbsp;&nbsp;&nbsp; typedef CTwo&lt; OneInt_type &gt; 
            TwoInt_type;<BR>&nbsp;&nbsp;&nbsp; TwoInt_type::two_value_type 
            i;<BR>&nbsp;&nbsp;&nbsp; int j;<BR>&nbsp;&nbsp;&nbsp; if ( typeid(i) 
            == typeid(j) )&nbsp;&nbsp; // 
            如果i是int型变量<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout 
            &lt;&lt; "Right!" &lt;&lt; endl;&nbsp;&nbsp; // 
            打印Right<BR>&nbsp;&nbsp;&nbsp; return;<BR>}<BR>//&nbsp; 
            ~tpname.cpp</P>
            <P>以上例子在Linux下用G++ 2.91编译通过, 结果打印"Right". 但是如果把*1行的注释号去掉, 注释<BR>*2行, 
            则编译时报错, 编译器不知道COne::one_value_type为何物. 通常在模板类参数中的类型到<BR>实例化之后才会显露真身, 
            但这个CTwo类偏偏又要依赖一个已经存在的COne模板类, 
            希望能够预先<BR>保证CTwo::two_value_type与COne::one_value属于同一类型, 
            这是就只好请typename出山, 告诉<BR>编译器, 
            后面的COne::one_value_type是一个已经存在于某处的类型的名字(type name), 
            这样编译<BR>器就可以顺利的工作了.</P><BR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
<TABLE align=center bgColor=#006699 border=0 cellPadding=0 cellSpacing=0 
width=770>
  <TBODY>
  <TR bgColor=#006699>
    <TD align=middle bgColor=#006699 id=white><FONT 
    color=#ffffff>对该文的评论</FONT></TD>
    <TD align=middle>
      <SCRIPT 
      src="CSDN_文档中心_STL知识准备 1_ C++关键字typename.files/readnum.htm"></SCRIPT>
    </TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1 
width=770>
  <TBODY>
  <TR>
    <TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16 
      hspace=1 src="CSDN_文档中心_STL知识准备 1_ C++关键字typename.files/ico_pencil.gif" 
      width=16> </SPAN>&nbsp;&nbsp;&nbsp;&nbsp; Lokioo <I>(2003-3-27 
      18:47:49)</I> </TD></TR>
  <TR>
    <TD bgColor=#ffffff colSpan=3 width=532><BR>我感觉啊~~~~~~~~~~~~ typename 在 
      struct ctwo 使用 类似与 (因为cone 是 也是模板类,而不是普通类.如果 "typedef cone::one_value_type 
      two_value_type" 这种形式的使用 肯定是错误..所以标准委员会的 使用一种方法 既 typename 前缀) 例如:: 
      template&lt;typename T&gt; class aA{ void f(); } shiyong时 A&lt;int&gt; a; 
      <BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1 
width=770>
  <TBODY>
  <TR>
    <TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16 
      hspace=1 src="CSDN_文档中心_STL知识准备 1_ C++关键字typename.files/ico_pencil.gif" 
      width=16> </SPAN>&nbsp;&nbsp;&nbsp;&nbsp; lattice <I>(2001-9-3 
      0:26:59)</I> </TD></TR>
  <TR>
    <TD bgColor=#ffffff colSpan=3 width=532><BR>Good <BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1 
width=770>
  <TBODY>
  <TR>
    <TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16 
      hspace=1 src="CSDN_文档中心_STL知识准备 1_ C++关键字typename.files/ico_pencil.gif" 
      width=16> </SPAN>&nbsp;&nbsp;&nbsp;&nbsp; huoxingang <I>(2001-1-17 
      14:03:38)</I> </TD></TR>
  <TR>
    <TD bgColor=#ffffff colSpan=3 width=532><BR>to myan: 
      我有标准C++的说明文档,不过是e文的,如果要可以发给你一份,html格式,不大,未压缩的3兆左右,忘了从哪里当的了,呵呵. 
  <BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1 
width=770>
  <TBODY>
  <TR>
    <TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16 
      hspace=1 src="CSDN_文档中心_STL知识准备 1_ C++关键字typename.files/ico_pencil.gif" 
      width=16> </SPAN>&nbsp;&nbsp;&nbsp;&nbsp; myan <I>(2001-1-15 18:33:20)</I> 
    </TD></TR>
  <TR>
    <TD bgColor=#ffffff colSpan=3 width=532><BR>呜呼呀, 感谢fengye!!! 
  <BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1 
width=770>
  <TBODY>
  <TR>
    <TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16 
      hspace=1 src="CSDN_文档中心_STL知识准备 1_ C++关键字typename.files/ico_pencil.gif" 
      width=16> </SPAN>&nbsp;&nbsp;&nbsp;&nbsp; eric000 <I>(2001-1-15 
      17:21:21)</I> </TD></TR>
  <TR>
    <TD bgColor=#ffffff colSpan=3 width=532><BR>建议楼上诸位看看ISO14882 
  <BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1 
width=770>
  <TBODY>
  <TR>
    <TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16 
      hspace=1 src="CSDN_文档中心_STL知识准备 1_ C++关键字typename.files/ico_pencil.gif" 
      width=16> </SPAN>&nbsp;&nbsp;&nbsp;&nbsp; Dev <I>(2001-1-15 14:58:10)</I> 
    </TD></TR>
  <TR>
    <TD bgColor=#ffffff colSpan=3 width=532><BR>有学则明之功,余诚待 myan 诸兄的最新研究成果。 
    <BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1 
width=770>
  <TBODY>
  <TR>
    <TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16 
      hspace=1 src="CSDN_文档中心_STL知识准备 1_ C++关键字typename.files/ico_pencil.gif" 
      width=16> </SPAN>&nbsp;&nbsp;&nbsp;&nbsp; fengye <I>(2001-1-15 
      11:51:37)</I> </TD></TR>
  <TR>
    <TD bgColor=#ffffff colSpan=3 
      width=532><BR>http://www.psyon.org/archive/e-books/programming/cpp/index.shtml 
      <BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1 
width=770>
  <TBODY>
  <TR>
    <TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16 
      hspace=1 src="CSDN_文档中心_STL知识准备 1_ C++关键字typename.files/ico_pencil.gif" 
      width=16> </SPAN>&nbsp;&nbsp;&nbsp;&nbsp; myan <I>(2001-1-14 18:55:37)</I> 
    </TD></TR>
  <TR>
    <TD bgColor=#ffffff colSpan=3 width=532><BR>谢谢bugn兄! 写了这篇文章之后, 我在Thinking 
      in C++ 2E中读到了有关typename的介绍, 基本上与我猜测的一致. 你指出的那个问题我没有在VC下试过. 
      之所以使用COne作为模板参数是因为在STL源代码中大量的模板参数都是用使用过的名字, 我就模仿之. 至于VC中的问题, 我倒认为是MS 
      的编译器不符合标准导致的. 不过你的建议对于编写可移植的代码还是十分重要的, 我欣然接受. 另: 那里有标准C++的说明? 
  <BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1 
width=770>
  <TBODY>
  <TR>
    <TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16 
      hspace=1 src="CSDN_文档中心_STL知识准备 1_ C++关键字typename.files/ico_pencil.gif" 
      width=16> </SPAN>&nbsp;&nbsp;&nbsp;&nbsp; bugn <I>(2001-1-14 2:05:47)</I> 
    </TD></TR>
  <TR>
    <TD bgColor=#ffffff colSpan=3 
      width=532><BR>另外要说明的是在做模板参数时class和typename没有区别的(参见C++标准里的说明)。这里可见在微软的编译器里template标识符有全局的作用域。 
      template &lt;class X&gt; // 用一个模板类作为模板参数, 这是很常见的 struct ctwo { typedef 
      typename X::one_value_type two_value_type; // *2 }; 与 template 
      &lt;typename X&gt; // 用一个模板类作为模板参数, 这是很常见的 struct ctwo { typedef typename 
      X::one_value_type two_value_type; // *2 }; 语法上完全等效 
<BR></TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1 
width=770>
  <TBODY>
  <TR>
    <TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16 
      hspace=1 src="CSDN_文档中心_STL知识准备 1_ C++关键字typename.files/ico_pencil.gif" 
      width=16> </SPAN>&nbsp;&nbsp;&nbsp;&nbsp; bugn <I>(2001-1-14 1:58:12)</I> 
    </TD></TR>
  <TR>
    <TD bgColor=#ffffff colSpan=3 width=532><BR>有问题: template &lt;typename 
      cone&gt; // 用一个模板类作为模板参数, 这是很常见的 struct ctwo { // 请注意以下两行 // typedef 
      cone::one_value_type two_value_type; // *1 typedef typename 
      cone::one_value_type two_value_type; // *2 }; 为了说明typename的用法,这里要改成 
      template &lt;typename X&gt; // 用一个模板类作为模板参数, 这是很常见的 struct ctwo { // 
      请注意以下两行 // typedef cone::one_value_type two_value_type; // *1 typedef 
      typename X::one_value_type two_value_type; // *2 }; 
      因为cone已经是用过的id了,所以你的代码在MS的编译器下要报错的;而且你为了说明typename的用法,也应该改过来。 
      在gcc中正常可能是因为编译器把在struct ctwo里面做模版参数的cone有了新的标识符定义。 
<BR></TD></TR></TBODY></TABLE><BR>
<DIV align=center>
<TABLE align=center bgColor=#cccccc border=0 cellPadding=2 cellSpacing=1 
width=770>
  <TBODY>
  <TR>
    <TH bgColor=#006699 id=white><FONT 
color=#ffffff>我要评论</FONT></TH></TR></TBODY></TABLE></DIV>
<DIV align=center>
<TABLE border=0 width=770>
  <TBODY>
  <TR>
    <TD>你没有登陆,无法发表评论。 请先<A 
      href="http://www.csdn.net/member/login.asp?from=/Develop/read_article.asp?id=3354">登陆</A> 
      <A 
href="http://www.csdn.net/expert/zc.asp">我要注册</A><BR></TD></TR></TBODY></TABLE></DIV><BR>
<HR noShade SIZE=1 width=770>

<TABLE border=0 cellPadding=0 cellSpacing=0 width=500>
  <TBODY>
  <TR align=middle>
    <TD height=10 vAlign=bottom><A 
      href="http://www.csdn.net/intro/intro.asp?id=2">网站简介</A> - <A 
      href="http://www.csdn.net/intro/intro.asp?id=5">广告服务</A> - <A 
      href="http://www.csdn.net/map/map.shtm">网站地图</A> - <A 
      href="http://www.csdn.net/help/help.asp">帮助信息</A> - <A 
      href="http://www.csdn.net/intro/intro.asp?id=2">联系方式</A> - <A 
      href="http://www.csdn.net/english">English</A> </TD>
    <TD align=middle rowSpan=3><A 
      href="http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001032100010"><IMG 
      border=0 height=48 
      src="CSDN_文档中心_STL知识准备 1_ C++关键字typename.files/biaoshi.gif" 
    width=40></A></TD></TR>
  <TR align=middle>
    <TD vAlign=top>百联美达美公司 版权所有 京ICP证020026号</TD></TR>
  <TR align=middle>
    <TD vAlign=top><FONT face=Verdana>Copyright &copy; CSDN.net, Inc. All rights 
      reserved</FONT></TD></TR>
  <TR>
    <TD height=15></TD>
    <TD></TD></TR></TBODY></TABLE></DIV>
<DIV></DIV><!--内容结束//--><!--结束//--></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -