C++:模板(template)中typename的使用方法

來源:互聯網
上載者:User

聲明template參數時, 首碼關鍵字class和typename可以互換;

使用關鍵字typename標識嵌套從屬類型名稱, 但不需在基類列表和成員初始化列表內使用.

從屬名稱(dependent names): 模板(template)內出現的名稱, 相依於某個模板(template)參數, 如T t;

嵌套從屬名稱(nested dependent names):從屬名稱在class內呈嵌套裝, 如T::const_iterator ci;

非從屬名稱(non-dependent names): 不依賴任何template參數的名稱, 如int value;

如果不特定指出typename, 嵌套從屬名稱, 有可能產生解析(parse)歧義.

任何時候在模板(template)中指涉一個嵌套從屬類型名稱, 需要在前一個位置, 添加關鍵字typename;

否則報錯(GCC): error: need 'typename' before 'T::xxx' because 'T' is a dependent scope

代碼:

/*  * BInsertSort.cpp  *  *  Created on: 2014.4.17.  *      Author: Spike  */      #include <iostream>  #include <string>  #include <vector>        using namespace std;        template<typename T>  void print2nd(const T& container) {      typename T::const_iterator iter(container.begin()); //未加typename, 報錯      ++iter;      int value = *iter;      std::cout << value;  }        int main () {      vector<int> vi = {1,2,3,4,5};      print2nd(vi);            return 0;  }

輸出:

2

例外:嵌套從屬類型名稱, 如果是基類列表(base class list)和成員初值列(member initialization list)中,不使用typename;

代碼:

/*  * BInsertSort.cpp  *  *  Created on: 2014.4.17  *      Author: Spike  */      #include <iostream>  #include <vector>        using namespace std;        struct Number {      Number(int x) {          std::cout << "Number = " << x << std::endl;      }  };        template<typename T>  struct Base{      typedef Number Nested;  };        template<typename T>  class Derived: public Base<T>::Nested { //不用typename  public:      explicit Derived(int x) : Base<T>::Nested(x) { //不用typename          typename Base<T>::Nested temp(7); //必須使用      }  };        int main () {      Derived<int> d(5);            return 0;  }

輸出:

Number = 5  Number = 7

更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/

當使用屬性類別(traits class)時, 必須使用typename, 如

代碼:

/*  * BInsertSort.cpp  *  *  Created on: 2014.4.17  *      Author: Spike  */      #include <array>  #include <iostream>        using namespace std;        template<typename T>  void workWithIter(T iter) {      typedef typename std::iterator_traits<T>::value_type value_type; //使用typename      value_type temp(*iter);      std::cout << "temp = " << temp << std::endl;        }        int main () {      std::array<int, 5> ai = {1,2,3,4,5};      std::array<int, 5>::iterator aiIter = ai.begin();      workWithIter(aiIter);      return 0;  }

輸出:

temp = 1

作者:csdn部落格 Spike_King

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.