最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++的template模板中class與typename關(guān)鍵字的區(qū)別分析

 更新時間:2016年06月24日 17:36:50   作者:visayafan  
這篇文章中我們來談一談C++的template模板中class與typename關(guān)鍵字的區(qū)別分析,同時會講到嵌套從屬名稱時的一些注意點,需要的朋友可以參考下

在C++模板中,可以使用class或者typename來聲明模板參數(shù),那么這兩個關(guān)鍵字有什么區(qū)別呢?

模板參數(shù)聲明
對于模板參數(shù)聲明,這兩個參數(shù)沒有區(qū)別,含義是一樣的。

template class Simple;
template class Simple;

上面兩行都是聲明一個模板類Simple.

表明類型
假如我們有這樣一段代碼:

template


void add(const T &acontainer, T &sum)
{
  T::const_iterator iter = container.begin();
  for (; iter != container.end(); ++iter) {
    sum += *iter;
  }
}

iter的類型是T::const_iterator,這個類型依賴模板參數(shù)T。把依賴模板參數(shù)的名稱稱為依賴名稱。當(dāng)這個依賴名稱又在一個類中時,稱為嵌套依賴名稱。相對的,稱為非嵌套依賴名稱。

嵌套依賴名稱會導(dǎo)致編譯器編譯的困難,例如下面的代碼:

template


void add(const T &container)
{
  T::const_iterator *x;
  ...
}

這看起來像聲明一個變量x,它的類型為T::const_iterator *。但是編譯器并不知道,也有可能類T中又一個static數(shù)據(jù)成員const_iterator,或者正好有一個全局變量x。這時上面的代碼就變成乘法操作。這是因為 C++編譯器在處理模板的時候,會將需要推導(dǎo)的數(shù)據(jù)類型暫時擱置,到運行時再確定。

當(dāng)編譯器遇到一個模板中的嵌套依賴名稱時,編譯器將它作為變量對待。因此,需要顯示的告訴編譯器,這就需要使用關(guān)鍵字typename。

template
void add(const T &container, T &sum)
{
  typename T::const_iterator iter = container.begin();
  for (; iter != container.end(); ++iter) {
    sum += *iter;
  }
}

因此,使用嵌套依賴的類型名稱時,都需要使用typename指定它是一種類型。

例外
嵌套依賴名稱在基類列表中,或者在成員初始化列表中時,不能使用typename。

template
class Drived: public Base::Nested { // 基類列表,不要使用typename
public:
  explicit Derived(int x): Base::Nested(x) { // 成員初始化列表,不要使用typename
    typename Base::Nested temp;
    ...
  }
  ...
};

另外一些注意點

1、嵌套從屬名稱(nested dependent names)
假如template內(nèi)出現(xiàn)的名稱如果依賴于某個模板參數(shù),則稱其為從屬名稱(dependent names),如果從屬名稱在class內(nèi)呈嵌套狀則稱之為嵌套從屬名稱(nested dependent names)。
例如:

templaet <typename T>void myPrint(const T& t){
  t::const_iterator iter(t.begin());
}

假設(shè)模板參數(shù)列表中的參數(shù)表示一個容器類型,則我們知道t::const_iterator一個依賴模板參數(shù)并且在容器內(nèi)部,所以t::const_iterator是一個嵌套從屬名稱。

在我們知道t是什么之前沒有辦法可以知道t::const_iterator是否是一個類型,因為有還可能是個靜態(tài)(static)成員變量,考慮下面的例子:

template <typename T>void myPrint(const T& t){
  t::const_iterator * x;
}

如果const_iterator是t的靜態(tài)成員變量,則上面的t::const_iterator * x;中的*表示乘法,如果是個類型則表示聲明一個指向t::const_iterator類型的指針。
從而給編譯器造成困惑(因為我們不知道t是什么)。

C++有個規(guī)定:當(dāng)解析器在模板中遇到一個嵌套從屬名稱時便假定這個名稱不是類型,除非你用關(guān)鍵字typename指定它是:

template <typename T>void myPrint(const T& t){
  typename t::const_iterator * x;   //這樣便不會造成困惑了}

同理不僅在內(nèi)部,在參數(shù)列表里也是:

template <typename T>void f(const T& t, typename T::const_iterator cit){
   //T不是嵌套從屬名稱,而T::const_iterator是,所以要在T::const_iterator前面加上typename    //....}

2、是嵌套從屬名稱但不用加typename的兩種情況
基類列表(base list)和成員初始化列表(member initializaiton list)
 
template <typename T>class Derived: public Base<T>::Nested {         //基類列表中不允許使用typenamepublic:
  explicit Derived(int x): Base<T>::Nested(int x){  //初始化列表中不允許使用typename    typename Base<T>::Nested temp;         //嵌套從屬名稱(既不在基類列表中又不在初始化列表中)前面必須要加typename  }
}

相關(guān)文章

  • c++ 標(biāo)準(zhǔn)庫多線程問題小結(jié)

    c++ 標(biāo)準(zhǔn)庫多線程問題小結(jié)

    C++11 引入了<thread>庫,使得多線程編程更加方便,以下是一些基本概念和示例,幫助你理解如何在 C++ 中進行多線程編程,這篇文章主要介紹了c++ 標(biāo)準(zhǔn)庫多線程,需要的朋友可以參考下
    2025-03-03
  • C++實現(xiàn)簡易通訊錄功能

    C++實現(xiàn)簡易通訊錄功能

    這篇文章主要為大家詳細介紹了C++實現(xiàn)簡易通訊錄功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++實現(xiàn)宿舍管理查詢系統(tǒng)

    C++實現(xiàn)宿舍管理查詢系統(tǒng)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)宿舍管理查詢系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言深入分析浮點型數(shù)據(jù)存儲

    C語言深入分析浮點型數(shù)據(jù)存儲

    使用編程語言進行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個變量時,就會在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么
    2022-08-08
  • 淺析C++中的多線程編程

    淺析C++中的多線程編程

    這篇文章主要為大家詳細介紹了C++中的多線程編程,包括創(chuàng)建線程、同步線程、傳遞數(shù)據(jù)給線程以及異常處理等方面,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • C++設(shè)計模式之觀察者模式

    C++設(shè)計模式之觀察者模式

    這篇文章主要介紹了C++設(shè)計模式之觀察者模式,本文講解了什么是觀察者模式、觀察者模式的UML類圖、觀察者模式的使用場合等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • 詳解C++編程中的靜態(tài)成員與可變數(shù)據(jù)成員

    詳解C++編程中的靜態(tài)成員與可變數(shù)據(jù)成員

    這篇文章主要介紹了詳解C++編程中的靜態(tài)成員與可變數(shù)據(jù)成員,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2016-01-01
  • C語言演示對歸并排序算法的優(yōu)化實現(xiàn)

    C語言演示對歸并排序算法的優(yōu)化實現(xiàn)

    這篇文章主要介紹了C語言演示對歸并排序算法的優(yōu)化實現(xiàn),歸并排序的最差時間復(fù)雜度為(n\log n),最優(yōu)時間復(fù)雜為(n),存在可以改進的空間,需要的朋友可以參考下
    2016-05-05
  • OpenCV實現(xiàn)車牌定位(C++)

    OpenCV實現(xiàn)車牌定位(C++)

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)車牌定位,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C語言的指針類型詳細解析

    C語言的指針類型詳細解析

    C語言的指針類型包括兩方面的信息:一是地址,存放在指針變量中;二是類型信息,關(guān)乎于讀寫的長度,沒有存儲在指針變量中,位于用該指針讀寫時的mov指令中,不同的讀寫長度對應(yīng)的mov指令不同
    2013-09-09

最新評論

平武县| 耿马| 罗田县| 平潭县| 甘肃省| 大姚县| 桃源县| 嘉定区| 安新县| 塔城市| 南康市| 石河子市| 临潭县| 濮阳县| 曲靖市| 镇江市| 海阳市| 乌兰浩特市| 长海县| 南昌市| 英吉沙县| 梅河口市| 剑河县| 临颍县| 乌兰浩特市| 洛浦县| 大丰市| 来安县| 米林县| 黔江区| 芒康县| 云南省| 嘉善县| 涿州市| 岚皋县| 开江县| 大余县| 石家庄市| 理塘县| 襄垣县| 荆门市|