亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++的template模板中class與typename關鍵字的區別分析

2020-05-23 14:02:28
字體:
來源:轉載
供稿:網友

在C++模板中,可以使用class或者typename來聲明模板參數,那么這兩個關鍵字有什么區別呢?

模板參數聲明
對于模板參數聲明,這兩個參數沒有區別,含義是一樣的。

template class Simple;template class Simple;

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

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

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

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

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

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

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

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

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

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

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

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

另外一些注意點

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

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

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

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

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

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

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

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

同理不僅在內部,在參數列表里也是:

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  }}
 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲丁香婷深爱综合| 久久久在线免费观看| 91免费电影网站| 欧美精品激情视频| 久久久久久久国产| 亚洲精品视频二区| 亚洲区在线播放| 北条麻妃久久精品| 日韩精品久久久久久久玫瑰园| 亚洲国产精彩中文乱码av在线播放| 91久久国产精品91久久性色| 久久99精品视频一区97| 日韩电影大片中文字幕| 97久久精品人搡人人玩| 久久精品99国产精品酒店日本| 亚洲电影免费观看高清完整版在线观看| 日韩二区三区在线| 国产欧美日韩91| 欧美理论电影在线播放| 国产日韩欧美电影在线观看| 亚洲免费人成在线视频观看| 国产欧美日韩丝袜精品一区| 国产精品揄拍一区二区| 久久久之久亚州精品露出| 亚洲精品日韩欧美| 亚洲乱码av中文一区二区| 欧美精品在线免费观看| 久久久久久国产精品三级玉女聊斋| 国产成人精品网站| 精品国产精品三级精品av网址| 日韩精品免费观看| 精品中文字幕在线观看| 少妇激情综合网| 国产不卡av在线免费观看| 日本最新高清不卡中文字幕| 久久成人精品电影| 国产成人综合一区二区三区| 好吊成人免视频| 中文字幕日韩高清| 久久中文字幕国产| 亚洲第一黄色网| 中文字幕免费国产精品| 精品久久久久人成| 久久琪琪电影院| 91精品久久久久久久久久久久久久| 欧美—级a级欧美特级ar全黄| 伊人成人开心激情综合网| 色噜噜久久综合伊人一本| 国产在线观看不卡| 亚洲电影av在线| 日韩在线视频观看正片免费网站| 91欧美精品午夜性色福利在线| 国产成人小视频在线观看| 亚洲va码欧洲m码| 韩国三级电影久久久久久| 亚洲乱码一区av黑人高潮| 9.1国产丝袜在线观看| 国产成人精彩在线视频九色| 国产精品久久久久av| 欧美激情精品久久久久久久变态| 在线看福利67194| 91精品国产综合久久久久久蜜臀| 26uuu国产精品视频| 久久99国产综合精品女同| 亚洲直播在线一区| 亚洲夜晚福利在线观看| 精品国产乱码久久久久久婷婷| 亚洲国产精品va在线观看黑人| 尤物yw午夜国产精品视频| 国产精品激情自拍| 一区二区三区四区视频| 午夜免费在线观看精品视频| 亚洲图片制服诱惑| 欧美日韩国产va另类| 中文字幕综合在线| 中文字幕亚洲欧美日韩在线不卡| 成人黄色在线免费| 中文字幕亚洲一区二区三区五十路| 国产精品毛片a∨一区二区三区|国| 国产综合久久久久| 在线视频日本亚洲性| 亚洲视频综合网| 欧美日韩国产成人| 91丝袜美腿美女视频网站| 亚洲人高潮女人毛茸茸| 日韩电视剧免费观看网站| 2019中文字幕在线免费观看| 亚洲伊人一本大道中文字幕| 亚洲国产另类久久精品| 亚洲一区二区少妇| 亚洲a成v人在线观看| 精品国产一区二区三区久久久| 亚洲老司机av| 亚洲男女自偷自拍图片另类| 精品久久久久久久久久国产| 海角国产乱辈乱精品视频| 亚洲欧美制服第一页| 国产精品美女视频网站| 日韩av在线免费看| 日韩精品www| 亚洲的天堂在线中文字幕| 国产精品青青在线观看爽香蕉| 国产精品久久久久久久久久久久久久| 国产精品久久精品| 亚洲一区二区在线| 国产一区二区激情| 在线中文字幕日韩| 色哟哟亚洲精品一区二区| 久久精品国产久精国产思思| 中文字幕日韩欧美精品在线观看| 欧美日韩亚洲精品内裤| 欧美色欧美亚洲高清在线视频| 日本精品一区二区三区在线播放视频| 午夜精品久久久久久久99黑人| 欧美人交a欧美精品| 亚洲乱码av中文一区二区| 亚洲国产欧美一区| 亚洲第一区在线观看| 久久亚洲电影天堂| 亚洲精品中文字幕有码专区| 日韩精品有码在线观看| 欧美高跟鞋交xxxxhd| 69久久夜色精品国产69乱青草| 日韩va亚洲va欧洲va国产| 日韩精品一区二区三区第95| 欧美日韩国产成人高清视频| 日韩日本欧美亚洲| 91禁外国网站| 88国产精品欧美一区二区三区| 国产精品免费一区豆花| 欧美大片在线免费观看| 欧美激情视频一区二区三区不卡| 国产欧美日韩最新| 91wwwcom在线观看| 69**夜色精品国产69乱| 色悠悠久久久久| 欧美日韩综合视频网址| 在线视频免费一区二区| 亚洲二区在线播放视频| 久久久久久国产三级电影| 亚洲曰本av电影| 欧美成人自拍视频| 91网站免费观看| 欧美激情一区二区三区在线视频观看| 97成人在线视频| 欧美日韩在线免费观看| 久久91精品国产| 成人黄色免费看| 精品国产91乱高清在线观看| 中文字幕九色91在线| 欧美日韩综合视频网址| 欧美高清无遮挡| 亚洲精品美女在线观看| 国产99视频在线观看| 国产噜噜噜噜久久久久久久久| 国产精品中文字幕久久久| 国产精品综合不卡av| 亚洲电影在线看| 欧美精品在线免费观看| 国产网站欧美日韩免费精品在线观看| 亚洲电影免费观看高清完整版在线观看| 久久99久久亚洲国产| 国产精品欧美激情在线播放| 欧美成人激情视频免费观看|