程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ typename不同應用方式介紹

C++ typename不同應用方式介紹

編輯:C++入門知識

在C++編程語言中,有很多比較高深的內容值得我們去深入的探討。我們先來看看其中一個比較重要的概念C++ typename的應用方式。C++ typename總是用來定義一個模板參數,在這個時候他和classname有相同的功效。

  • C++數組參數應用方式探討
  • C++類模板應用代碼深入剖析
  • C++類模板特化基本概念概述
  • C++非類型類模板參數基本概念正確理解
  • C++函數模板非類型參數應用注意事項總結

可是,typename的作用並不限於此。試想,在模板參數的類型中有一個嵌套類,而在我們的模板中需要使用這個嵌套類。那麼,可能的寫法為[T::SubType * ptr]。

問題是,T只是一個類型參數,編譯器並不能確切的知道T中有哪些成員。因此,對於編譯器來說,更為合理的做法把SubType看成了一個T中的靜態成員,從而把上面的代碼理解為T中的靜態成員SubType乘上ptr。我想,這與編譯器在模板實例化時的處理方式有關。我不知道編譯器在實例化模板的時候會按什麼步驟走,但是肯定和普通的類實例化完全不一樣。因為按照正常的類的實例化過程,編譯器完全應該能知道SubType是T中的一個嵌套類。希望書中後面的內容能提供解釋)。

這個時候C++ typename就能夠明確的告訴編譯器,SubType是一個類型,需要按照類型的方式處理。

下面是書中的一個實例:

  1. #include < iostream> 
  2. #include < vector> 
  3. template< typename T> 
  4. void printcoll(T const& coll)  
  5. {  
  6. typename T::const_iterator pos;  
  7. typename T::const_iterator end(coll.end());  
  8. for(pos = coll.begin(); pos != end; ++pos)  
  9. {  
  10. std::cout< < *pos< < ' ';  
  11. }  
  12. std::cout< < std::endl;  
  13. }  
  14. int _tmain(int argc, _TCHAR* argv[])  
  15. {  
  16. // 測試printcoll  
  17. std::vector< int> intVector;  
  18. intVector.push_back(1);  
  19. intVector.push_back(2);  
  20. intVector.push_back(3);  
  21. intVector.push_back(4);  
  22. printcoll(intVector);  
  23. return 0;  

注意到第7行和第8行,在定義變量的時候迭代器const_iterator是容器T中的一個類型。因此,在定義T::const_iterator的變量的時候需要在前面加上typename。可以說,正是由於const_iterator是一個依賴於模板參數的類型,所以我們必須使用C++ typename明確的指它是一個類型。否則,編譯器就不能正常識別。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved