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

首頁 > 學院 > 開發設計 > 正文

C++箴言:理解typename兩個含義

2019-11-17 05:09:06
字體:
來源:轉載
供稿:網友

  在下面的 template declarations(模板聲明)中 class 和 typename 有什么不同?

  template class Widget; // uses "class"
  template class Widget; // uses "typename"

  答案:沒什么不同。在聲明一個 template type parameter(模板類型參數)的時候,class 和 typename 意味著完全相同的東西。一些程序員更喜歡在所有的時間都用 class,因為它更輕易輸入。其他人(包括我本人)更喜歡 typename,因為它暗示著這個參數不必要是一個 class type(類類型)。少數開發者在任何類型都被答應的時候使用 typename,而把 class 保留給僅接受 user-defined types(用戶定義類型)的場合。但是從 C++ 的觀點看,class 和 typename 在聲明一個 template parameter(模板參數)時意味著完全相同的東西。

  然而,C++ 并不總是把 class 和 typename 視為等同的東西。有時你必須使用 typename。為了理解這一點,我們不得不討論你會在一個 template(模板)中涉及到的兩種名字。

  假設我們有一個函數的模板,它能取得一個 STL-compatible container(STL 兼容容器)中持有的能賦值給 ints 的對象。進一步假設這個函數只是簡單地打印它的第二個元素的值。它是一個用糊涂的方法實現的糊涂的函數,而且就像我下面寫的,它甚至不能編譯,但是請將這些事先放在一邊——有一種方法能發現我的愚蠢:

  template // PRint 2nd element in
  void print2nd(const C& container) // container;
  {
  // this is not valid C++!
  if (container.size() >= 2) {
  C::const_iterator iter(container.begin()); // get iterator to 1st element
  ++iter; // move iter to 2nd element
  int value = *iter; // copy that element to an int
  std::cout << value; // print the int
  }
  }

  我突出了這個函數中的兩個 local variables(局部變量),iter 和 value。iter 的類型是 C::const_iterator,一個依靠于 template parameter(模板參數)C 的類型。一個 template(模板)中的依靠于一個 template parameter(模板參數)的名字被稱為 dependent names(依靠名字)。當一個 dependent names(依靠名字)嵌套在一個 class(類)的內部時,我稱它為 nested dependent name(嵌套依靠名字)。C::const_iterator 是一個 nested dependent name(嵌套依靠名字)。實際上,它是一個 nested dependent type name(嵌套依靠類型名),也就是說,一個涉及到一個 type(類型)的 nested dependent name(嵌套依靠名字)。

  print2nd 中的另一個 local variable(局部變量)value 具有 int 類型。int 是一個不依靠于任何 template parameter(模板參數)的名字。這樣的名字以 non-dependent names(非依靠名字)聞名。(我想不通為什么他們不稱它為 independent names(無依靠名字)。假如,像我一樣,你發現術語 "non-dependent" 是一個令人厭惡的東西,你就和我產生了共鳴,但是 "non-dependent" 就是這類名字的術語,所以,像我一樣,轉轉眼睛放棄你的自我主張。)

  nested dependent name(嵌套依靠名字)會導致解析困難。例如,假設我們更加愚蠢地以這種方法開始 print2nd:

  template
  void print2nd(const C& container)
  {
  C::const_iterator * x;
  ...
  }

  這看上去似乎是我們將 x 聲明為一個指向 C::const_iterator 的 local variable(局部變量)。但是它看上去如此僅僅是因為我們知道 C::const_iterator 是一個 type(類型)。但是假如 C::const_iterator 不是一個 type(類型)呢?假如 C 有一個 static data member(靜態數據成員)碰巧就叫做 const_iterator 呢?再假如 x 碰巧是一個 global variable(全局變量)的名字呢?在這種情況下,上面的代碼就不是聲明一個 local variable(局部變量),而是成為 C::const_iterator 乘以 x!當然,這聽起來有些愚蠢,但它是可能的,而編寫 C++ 解析器的人必須考慮所有可能的輸入,甚至是愚蠢的。

  在下面的 template declarations(模板聲明)中 class 和 typename 有什么不同?

  template class Widget; // uses "class"
  template class Widget; // uses "typename"

  答案:沒什么不同。在聲明一個 template type parameter(模板類型參數)的時候,class 和 typename 意味著完全相同的東西。一些程序員更喜歡在所有的時間都用 class,因為它更輕易輸入。其他人(包括我本人)更喜歡 typename,因為它暗示著這個參數不必要是一個 class type(類類型)。少數開發者在任何類型都被答應的時候使用 typename,而把 class 保留給僅接受 user-defined types(用戶定義類型)的場合。但是從 C++ 的觀點看,class 和 typename 在聲明一個 template parameter(模板參數)時意味著完全相同的東西。

  然而,C++ 并不總是把 class 和 typename 視為等同的東西。有時你必須使用 typename。為了理解這一點,我們不得不討論你會在一個 template(模板)中涉及到的兩種名字。
  假設我們有一個函數的模板,它能取得一個 STL-compatible container(STL 兼容容器)中持有的能賦值給 ints 的對象。進一步假設這個函數只是簡單地打印它的第二個元素的值。
它是一個用糊涂的方法實現的糊涂的函數,而且就像我下面寫的,它甚至不能編譯,但是請將這些事先放在一邊——有一種方法能發現我的愚蠢:

  template // print 2nd element in
  void print2nd(const C& container) // container;
  {
  // this is not valid C++!
  if (container.size() >= 2) {
  C::const_iterator iter(container.begin()); // get iterator to 1st element
  ++iter; // move iter to 2nd element
  int value = *iter; // copy that element to an int
  std::cout << value; // print the int
  }
  }

  我突出了這個函數中的兩個 local variables(局部變量),iter 和 value。iter 的類型是 C::const_iterator,一個依靠于 template parameter(模板參數)C 的類型。一個 template(模板)中的依靠于一個 template parameter(模板參數)的名字被稱為 dependent names(依靠名字)。當一個 dependent names(依靠名字)嵌套在一個 class(類)的內部時,我稱它為 nested dependent name(嵌套依靠名字)。C::const_iterator 是一個 nested dependent name(嵌套依靠名字)。實際上,它是一個 nested dependent type name(嵌套依靠類型名),也就是說,一個涉及到一個 type(類型)的 nested dependent name(嵌套依靠名字)。

  print2nd 中的另一個 local variable(局部變量)value 具有 int 類型。int 是一個不依靠于任何 template parameter(模板參數)的名字。這樣的名字以 non-dependent names(非依靠名字)聞名。(我想不通為什么他們不稱它為 independent names(無依靠名字)。假如,像我一樣,你發現術語 "non-dependent" 是一個令人厭惡的東西,你就和我產生了共鳴,但是 "non-dependent" 就是這類名字的術語,所以,像我一樣,轉轉眼睛放棄你的自我主張。)

  nested dependent name(嵌套依靠名字)會導致解析困難。例如,假設我們更加愚蠢地以這種方法開始 print2nd:

  template
  void print2nd(const C& container)
  {
  C::const_iterator * x;
  ...
  }

  這看上去似乎是我們將 x 聲明為一個指向 C::const_iterator 的 local variable(局部變量)。但是它看上去如此僅僅是因為我們知道 C::const_iterator 是一個 type(類型)。但是假如 C::const_iterator 不是一個 type(類型)呢?假如 C 有一個 static data member(靜態數據成員)碰巧就叫做 const_iterator 呢?再假如 x 碰巧是一個 global variable(全局變量)的名字呢?在這種情況下,上面的代碼就不是聲明一個 local variable(局部變量),而是成為 C::const_iterator 乘以 x!當然,這聽起來有些愚蠢,但它是可能的,而編寫 C++ 解析器的人必須考慮所有可能的輸入,甚至是愚蠢的。

  在下面的 template declarations(模板聲明)中 class 和 typename 有什么不同?

  template class Widget; // uses "class"
  template class Widget; // uses "typename"

  答案:沒什么不同。在聲明一個 template type parameter(模板類型參數)的時候,class 和 typename 意味著完全相同的東西。一些程序員更喜歡在所有的時間都用 class,因為它更輕易輸入。其他人(包括我本人)更喜歡 typename,因為它暗示著這個參數不必要是一個 class type(類類型)。少數開發者在任何類型都被答應的時候使用 typename,而把 class 保留給僅接受 user-defined types(用戶定義類型)的場合。但是從 C++ 的觀點看,class 和 typename 在聲明一個 template parameter(模板參數)時意味著完全相同的東西。

  然而,C++ 并不總是把 class 和 typename 視為等同的東西。有時你必須使用 typename。為了理解這一點,我們不得不討論你會在一個 template(模板)中涉及到的兩種名字。

  假設我們有一個函數的模板,它能取得一個 STL-compatible container(STL 兼容容器)中持有的能賦值給 ints 的對象。進一步假設這個函數只是簡單地打印它的第二個元素的值。它是一個用糊涂的方法實現的糊涂的函數,而且就像我下面寫的,它甚至不能編譯,但是請將這些事先放在一邊——有一種方法能發現我的愚蠢:

  template // print 2nd element in
  void print2nd(const C& container) // container;
  {
  // this is not valid C++!
  if (container.size() >= 2) {
  C::const_iterator iter(container.begin()); // get iterator to 1st element
  ++iter; // move iter to 2nd element
  int value = *iter; // copy that element to an int
  std::cout << value; // print the int
  }
  }

  我突出了這個函數中的兩個 local variables(局部變量),iter 和 value。
iter 的類型是 C::const_iterator,一個依靠于 template parameter(模板參數)C 的類型。一個 template(模板)中的依靠于一個 template parameter(模板參數)的名字被稱為 dependent names(依靠名字)。當一個 dependent names(依靠名字)嵌套在一個 class(類)的內部時,我稱它為 nested dependent name(嵌套依靠名字)。C::const_iterator 是一個 nested dependent name(嵌套依靠名字)。實際上,它是一個 nested dependent type name(嵌套依靠類型名),也就是說,一個涉及到一個 type(類型)的 nested dependent name(嵌套依靠名字)。

  print2nd 中的另一個 local variable(局部變量)value 具有 int 類型。int 是一個不依靠于任何 template parameter(模板參數)的名字。這樣的名字以 non-dependent names(非依靠名字)聞名。(我想不通為什么他們不稱它為 independent names(無依靠名字)。假如,像我一樣,你發現術語 "non-dependent" 是一個令人厭惡的東西,你就和我產生了共鳴,但是 "non-dependent" 就是這類名字的術語,所以,像我一樣,轉轉眼睛放棄你的自我主張。)

  nested dependent name(嵌套依靠名字)會導致解析困難。例如,假設我們更加愚蠢地以這種方法開始 print2nd:

  template
  void print2nd(const C& container)
  {
  C::const_iterator * x;
  ...
  }

  這看上去似乎是我們將 x 聲明為一個指向 C::const_iterator 的 local variable(局部變量)。但是它看上去如此僅僅是因為我們知道 C::const_iterator 是一個 type(類型)。但是假如 C::const_iterator 不是一個 type(類型)呢?假如 C 有一個 static data member(靜態數據成員)碰巧就叫做 const_iterator 呢?再假如 x 碰巧是一個 global variable(全局變量)的名字呢?在這種情況下,上面的代碼就不是聲明一個 local variable(局部變量),而是成為 C::const_iterator 乘以 x!當然,這聽起來有些愚蠢,但它是可能的,而編寫 C++ 解析器的人必須考慮所有可能的輸入,甚至是愚蠢的。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
深夜福利亚洲导航| 国产视频精品久久久| 国模私拍一区二区三区| 国产精品久久久久久久9999| 欧美亚洲免费电影| 精品久久久久久久久久久久久久| 91精品国产综合久久久久久久久| 欧美精品在线免费播放| 国产成人av在线播放| 欧美一级淫片aaaaaaa视频| 亚洲国产美女久久久久| 日本亚洲欧美三级| 一区二区三区黄色| 欧美成人在线网站| 欧美日在线观看| 欧美性少妇18aaaa视频| 成人自拍性视频| 亚洲一区二区三区乱码aⅴ蜜桃女| 精品国产31久久久久久| 亚洲欧美一区二区精品久久久| 精品久久久久久久大神国产| 在线观看久久av| 日韩成人av在线| 久久精品视频导航| 亚洲一区制服诱惑| 91情侣偷在线精品国产| 国产精品2018| 久久久久久久久久av| 国产噜噜噜噜久久久久久久久| 久热精品视频在线观看一区| 日韩av在线免费观看| 成人动漫网站在线观看| 这里只有精品在线观看| 国产精品日韩电影| 国产精品老牛影院在线观看| 国产91av在线| 久久人人爽人人爽人人片亚洲| 中文字幕av一区中文字幕天堂| 国产精品视频yy9099| 青青草原成人在线视频| 国产精品久久久久久久久借妻| 国内精品400部情侣激情| 国产精品视频中文字幕91| 久久久成人精品| 久久久噜噜噜久久中文字免| 91久久精品美女| 久久久国产一区二区| 久久久久免费精品国产| 久久久久久久久亚洲| 成人免费网视频| 亚洲网在线观看| 国产精品国产福利国产秒拍| 亚洲自拍另类欧美丝袜| 国产婷婷色综合av蜜臀av| 成人国产在线激情| 欧美午夜激情在线| 日韩精品免费观看| 欧美另类69精品久久久久9999| 久久天天躁狠狠躁夜夜躁2014| 欧美成人h版在线观看| 国产91免费看片| 最近免费中文字幕视频2019| 亚洲精品v天堂中文字幕| 欧美裸体xxxx| 大伊人狠狠躁夜夜躁av一区| 国产精品自产拍在线观| 久久精品国产久精国产一老狼| 91欧美精品成人综合在线观看| 欧美做爰性生交视频| 亚洲福利视频网| 国产成人精品最新| 亚洲人成网站在线播| 中文字幕亚洲一区二区三区| 久久久97精品| 亚洲va欧美va在线观看| 午夜精品久久久久久久白皮肤| 亚洲一区二区三区四区视频| 欧美中在线观看| 亚洲欧美在线一区二区| 国产日韩亚洲欧美| 日韩av电影手机在线观看| 亚洲欧美国产一本综合首页| 最近2019中文免费高清视频观看www99| 久久人人爽人人爽人人片亚洲| 国产欧洲精品视频| 国产丝袜精品第一页| 欧美日韩国产一中文字不卡| 亚洲国产另类 国产精品国产免费| 亚洲色图欧美制服丝袜另类第一页| 国语自产在线不卡| 国产精品美女免费视频| 中文字幕视频一区二区在线有码| 九九热最新视频//这里只有精品| 亚洲一区二区三区四区视频| 国产精品va在线播放| 精品免费在线视频| 日本久久精品视频| 亚洲第一福利视频| 国产深夜精品福利| 国产精品com| 日韩av在线免费看| 国产精品久久久久久久久久东京| 人人澡人人澡人人看欧美| 国产精品久久久久久av福利| 欧美日韩国产综合视频在线观看中文| 91精品视频在线| 欧美视频在线免费| 亚洲乱码一区av黑人高潮| 欧美乱大交做爰xxxⅹ性3| 亚洲国产私拍精品国模在线观看| 国产精品免费久久久久久| 久久天天躁狠狠躁夜夜躁2014| 狠狠色狠狠色综合日日五| 亚洲精品v天堂中文字幕| 日韩精品中文字幕在线| 国产一区深夜福利| 亚洲国产高清自拍| 久久久久久国产精品久久| 九九久久国产精品| 欧美一级大片在线免费观看| 国产精品jizz在线观看麻豆| 亚洲精品黄网在线观看| 国产精品高精视频免费| 欧美福利小视频| 欧美一级bbbbb性bbbb喷潮片| 在线色欧美三级视频| 久久精品视频中文字幕| 在线日韩日本国产亚洲| 美女999久久久精品视频| 亚洲欧洲成视频免费观看| 国产精品免费一区| 91精品视频在线免费观看| 日韩欧美亚洲一二三区| 亚洲欧美三级在线| 97视频在线观看成人| 色婷婷综合久久久久中文字幕1| 九九热最新视频//这里只有精品| 亚洲欧洲在线播放| 一本色道久久综合狠狠躁篇的优点| 91精品视频在线免费观看| 欧美美最猛性xxxxxx| 91免费视频网站| 中文字幕av日韩| 亚洲最新av在线| 91精品久久久久久久久久久| 亚洲国产又黄又爽女人高潮的| 久久久久久久av| 一本色道久久综合狠狠躁篇怎么玩| 日韩欧美a级成人黄色| 国产精品久久久久久亚洲影视| 久久6精品影院| 日韩av免费在线看| 欧美日韩亚洲91| 欧美激情精品久久久久| 97视频在线观看播放| 欧美激情精品久久久久久免费印度| 精品国产一区av| 欧美精品激情视频| 日本精品一区二区三区在线播放视频| 国产欧美日韩精品专区| 91精品久久久久久久久久久久久| 久久五月天色综合| 亚洲热线99精品视频| 国产一区av在线|