1. 程式人生 > >模板類中的成員函式定義返回值為類中的typedef型別時候注意

模板類中的成員函式定義返回值為類中的typedef型別時候注意

如果模板類中的成員要訪問類中的typedef型別必須加上關鍵字typename來指明它是一個型別。

如一下程式碼中的那個成員函式size。

  1. #include <iostream>
  2. #include <string>
  3. template<typename Type>  
  4. class List  
  5. {  
  6. public:  
  7.     typedef unsigned size_type;  
  8. public:  
  9.     List();  
  10.     void push_back(const Type &value);  
  11.     void push_front(
    const Type &value);  
  12.     Type& front() const;  
  13.     Type& back() const;  
  14.     size_type size() const;  
  15.     ~List();  
  16. private:  
  17.     struct DataType  
  18.     {  
  19.         Type Value;  
  20.         struct DataType *next;  
  21.     }head;  
  22.     struct DataType *end;  
  23. };  
  24. template<typename Type>  
  25. List<Type>::List()  
  26. {  
  27.     head.next = 0;  
  28.     end = &head;  
  29. }  
  30. template<typename Type>  
  31. void List<Type>::push_back(const Type &value)  
  32. {  
  33.     DataType *tmp = new DataType;  
  34.     tmp->Value = value;  
  35.     tmp->next = 0;  
  36.     end->next = tmp;  
  37.     end = tmp;  
  38. }  
  39. template<typename Type>  
  40. void List<Type>::push_front(const Type &value)  
  41. {  
  42.     DataType *tmp = new DataType;  
  43.     tmp->Value = value;  
  44.     tmp->next = 0;  
  45.     tmp->next = head.next;  
  46.     head.next = tmp;  
  47. }  
  48. template<typename Type>  
  49. Type& List<Type>::front() const
  50. {  
  51.     return head.next->Value;  
  52. }  
  53. template<typename Type>  
  54. Type& List<Type>::back() const
  55. {  
  56.     return end->Value;  
  57. }  
  58. template<typename Type>  
  59. typename List<Type>::size_type List<Type>::size() const
  60. {  
  61.     size_type iSize = 0;  
  62.     struct DataType *begin = &head;  
  63.     while (begin->next)  
  64.     {  
  65.         ++iSize;  
  66.     }  
  67.     return iSize;  
  68. }  
  69. template<typename Type>  
  70. List<Type>::~List()  
  71. {  
  72.     struct DataType *tmp = &head;  
  73.     while (tmp = tmp->next)  
  74.     {  
  75.         head.next = tmp->next;  
  76.         free(tmp);  
  77.         tmp = &head;  
  78.     }  
  79. }  
  80. int main()  
  81. {  
  82.     List<int> list;  
  83.     list.push_back(100);  
  84.     list.push_front(200);  
  85.     std::cout << list.front() << "/t" << list.back() << std::endl;  
  86.     system("pause");  
  87.     return 0;  
  88. }