C++ typename不同應(yīng)用方式介紹
在C++編程語(yǔ)言中,有很多比較高深的內(nèi)容值得我們?nèi)ド钊氲奶接?。我們先?lái)看看其中一個(gè)比較重要的概念C++ typename的應(yīng)用方式。C++ typename總是用來(lái)定義一個(gè)模板參數(shù),在這個(gè)時(shí)候他和classname有相同的功效。#t#
可是,typename的作用并不限于此。試想,在模板參數(shù)的類型中有一個(gè)嵌套類,而在我們的模板中需要使用這個(gè)嵌套類。那么,可能的寫法為[T::SubType * ptr]。
問(wèn)題是,T只是一個(gè)類型參數(shù),編譯器并不能確切的知道T中有哪些成員。因此,對(duì)于編譯器來(lái)說(shuō),更為合理的做法把SubType看成了一個(gè)T中的靜態(tài)成員,從而把上面的代碼理解為T中的靜態(tài)成員SubType乘上ptr。(我想,這與編譯器在模板實(shí)例化時(shí)的處理方式有關(guān)。我不知道編譯器在實(shí)例化模板的時(shí)候會(huì)按什么步驟走,但是肯定和普通的類實(shí)例化完全不一樣。因?yàn)榘凑照5念惖膶?shí)例化過(guò)程,編譯器完全應(yīng)該能知道SubType是T中的一個(gè)嵌套類。希望書中后面的內(nèi)容能提供解釋)。
這個(gè)時(shí)候C++ typename就能夠明確的告訴編譯器,SubType是一個(gè)類型,需要按照類型的方式處理。
下面是書中的一個(gè)實(shí)例:
- #include < iostream>
- #include < vector>
- template< typename T>
- void printcoll(T const& coll)
- {
- typename T::const_iterator pos;
- typename T::const_iterator end(coll.end());
- for(pos = coll.begin(); pos != end; ++pos)
- {
- std::cout< < *pos< < ' ';
- }
- std::cout< < std::endl;
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- // 測(cè)試printcoll
- std::vector< int> intVector;
- intVector.push_back(1);
- intVector.push_back(2);
- intVector.push_back(3);
- intVector.push_back(4);
- printcoll(intVector);
- return 0;
- }
注意到第7行和第8行,在定義變量的時(shí)候迭代器const_iterator是容器T中的一個(gè)類型。因此,在定義T::const_iterator的變量的時(shí)候需要在前面加上typename??梢哉f(shuō),正是由于const_iterator是一個(gè)依賴于模板參數(shù)的類型,所以我們必須使用C++ typename明確的指它是一個(gè)類型。否則,編譯器就不能正常識(shí)別。