📄 csdn_文档中心_stl知识准备 1_ c++关键字typename.htm
字号:
因为目前我找不到有关这个问题的说明, 所以自己试验了<BR>一下, 得到一个猜测, 现简介如下, 请有识之士斧正.</P>
<P>首先看一段SGI*STL源代码, 摘自stl_iterator.h</P>
<P>1: template <class _Container, class _Iterator><BR>2:
inline insert_iterator<_Container> inserter(_Container&
__x, _Iterator __i)<BR>3: {<BR>4: typedef typename
_Container::iterator __iter;<BR>5: return
insert_iterator<_Container>(__x, __iter(__i));<BR>6:
}</P>
<P>令人费解的部分在第四行. 请大家在看我的解释之前先想一想, 我不敢保证下面解释的正确性和<BR>全面性.</P>
<P>解释: <BR> 我认为typename的语义是: 通知编译器,
在typename后面被声明的东西是一个类型, 而不是别的<BR>什么东西.</P>
<P>例子:<BR>// tpname.cpp<BR>#include <iostream><BR>#include
<typeinfo> // for typeid() operator</P>
<P>using namespace std;</P>
<P>template <typename TP><BR>struct COne { //
default member is public<BR> typedef TP
one_value_type;<BR>};</P>
<P>template <typename COne> // 用一个模板类作为模板参数,
这是很常见的<BR>struct CTwo {<BR> //
请注意以下两行<BR> // typedef COne::one_value_type
two_value_type; // *1<BR> typedef
typename COne::one_value_type
two_value_type; // *2 <BR>};</P>
<P>// 以上两个模板类只是定义了两个内部的public类型, 但请注意第二个类CTwo的two_value_type类型<BR>//
依赖COne的one_value_type, 而后者又取决于COne模板类实例化时传入的参数类型.</P>
<P>int main()<BR>{<BR> typedef COne<int>
OneInt_type;<BR> typedef CTwo< OneInt_type >
TwoInt_type;<BR> TwoInt_type::two_value_type
i;<BR> int j;<BR> if ( typeid(i)
== typeid(j) ) //
如果i是int型变量<BR> cout
<< "Right!" << endl; //
打印Right<BR> return;<BR>}<BR>//
~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> 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<typename T> class aA{ void f(); } shiyong时 A<int> 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> 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> 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> 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> 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> 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> 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> 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> 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 <class X> // 用一个模板类作为模板参数, 这是很常见的 struct ctwo { typedef
typename X::one_value_type two_value_type; // *2 }; 与 template
<typename X> // 用一个模板类作为模板参数, 这是很常见的 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> bugn <I>(2001-1-14 1:58:12)</I>
</TD></TR>
<TR>
<TD bgColor=#ffffff colSpan=3 width=532><BR>有问题: template <typename
cone> // 用一个模板类作为模板参数, 这是很常见的 struct ctwo { // 请注意以下两行 // typedef
cone::one_value_type two_value_type; // *1 typedef typename
cone::one_value_type two_value_type; // *2 }; 为了说明typename的用法,这里要改成
template <typename X> // 用一个模板类作为模板参数, 这是很常见的 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 © 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 + -