轉(zhuǎn)載自:http://dev.csdn.net/article/3/3354.shtm
/*******************************************************************************
* SGI*STL是STL之父Alexander Stepanov和STL巨匠Matt Austern等人的作品, 是當(dāng)今 *
* 最富盛名、最出色的STL實現(xiàn)版本,全部源代碼和說明文檔可從www.sgi.com/STL/下 *
* 載, 是我們學(xué)習(xí)STL的最佳范本. 但是眾所周知, STL使用了大量復(fù)雜艱深的C++特性, *
* 加上STL本身的復(fù)雜和龐大, 使得閱讀代碼本身就成為一件非常困難的工作. 以下文 *
* 字是我在學(xué)習(xí)STL過程中得到的一些經(jīng)驗和猜測, 希望能對大家有所幫助, 更希望能 *
* 得到大家的批評和指正, 以利于我們的共同提高. *
* myan *
*******************************************************************************/
在SGI*STL源代碼里, typename這個新的C++關(guān)鍵字得使用可以說是隨處可見. 很多以前學(xué)習(xí)過
C++的人可能還不認(rèn)識typename, 其實它的常規(guī)用法很簡單: 在聲明模板函數(shù)或者模板類時,
傳統(tǒng)的寫法:
template <class T>
generic_function() {
//........
}
亦可以寫成
template <typename T>
------------
generic_func() {
//...............
}
引入這個關(guān)鍵字主要是為了避免class可能給人帶來的混淆.
本來typename的用法就是這么簡單, 但是STL源代碼中還有typename的一種不常見的用法, 如果
不了解, 閱讀源代碼時就會遇到困難. 因為目前我找不到有關(guān)這個問題的說明, 所以自己試驗了
一下, 得到一個猜測, 現(xiàn)簡介如下, 請有識之士斧正.
首先看一段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: }
令人費(fèi)解的部分在第四行. 請大家在看我的解釋之前先想一想, 我不敢保證下面解釋的正確性和
全面性.
解釋:
我認(rèn)為typename的語義是: 通知編譯器, 在typename后面被聲明的東西是一個類型, 而不是別的
什么東西.
1
例子:
2
// tpname.cpp
3
#include <iostream>
4
#include <typeinfo> // for typeid() operator
5
6
using namespace std;
7
8
template <typename TP>
9
struct COne
{ // default member is public
10
typedef TP one_value_type;
11
};
12
13
template <typename COne> // 用一個模板類作為模板參數(shù), 這是很常見的
14
struct CTwo
{
15
// 請注意以下兩行
16
// typedef COne::one_value_type two_value_type; // *1
17
typedef typename COne::one_value_type two_value_type; // *2
18
};
19
20
// 以上兩個模板類只是定義了兩個內(nèi)部的public類型, 但請注意第二個類CTwo的two_value_type類型
21
// 依賴COne的one_value_type, 而后者又取決于COne模板類實例化時傳入的參數(shù)類型.
22
23
int main()
24

{
25
typedef COne<int> OneInt_type;
26
typedef CTwo< OneInt_type > TwoInt_type;
27
TwoInt_type::two_value_type i;
28
int j;
29
if ( typeid(i) == typeid(j) ) // 如果i是int型變量
30
cout << "Right!" << endl; // 打印Right
31
return;
32
}
33
// ~tpname.cpp
34
以上例子在Linux下用G++ 2.91編譯通過, 結(jié)果打印"Right". 但是如果把*1行的注釋號去掉, 注釋
*2行, 則編譯時報錯, 編譯器不知道COne::one_value_type為何物. 通常在模板類參數(shù)中的類型到
實例化之后才會顯露真身, 但這個CTwo類偏偏又要依賴一個已經(jīng)存在的COne模板類, 希望能夠預(yù)先
保證CTwo::two_value_type與COne::one_value屬于同一類型, 這是就只好請typename出山, 告訴
編譯器, 后面的COne::one_value_type是一個已經(jīng)存在于某處的類型的名字(type name), 這樣編譯
器就可以順利的工作了.
posted on 2008-06-24 21:56
楊彬彬 閱讀(218)
評論(0) 編輯 收藏 引用 所屬分類:
C++語言