日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【C++】typename

發布時間:2023/12/20 c/c++ 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C++】typename 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

參考《Effective C++》條款42:Understand the two meaning of typename

Table of Contents

  • 1 模板參數列表中與class關鍵字可相互替換
  • 2 嵌套從屬名稱(nested dependent names)
  • 3 是嵌套從屬名稱但不用加typename的兩種情況

1 模板參數列表中與class關鍵字可相互替換

?

template<typename T> template<class T> 是一樣的

2 嵌套從屬名稱(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 //.... }

3 是嵌套從屬名稱但不用加typename的兩種情況

基類列表(base list)和成員初始化列表(member initializaiton list)

?

template <typename T> class Derived: public Base<T>::Nested { //基類列表中不允許使用typename public:explicit Derived(int x): Base<T>::Nested(int x){ //初始化列表中不允許使用typename typename Base<T>::Nested temp; //嵌套從屬名稱(既不在基類列表中又不在初始化列表中)前面必須要加typename } }

Author: visayafan <visayafan@gmail.com>

Date: 2011-11-29 18:49:57

HTML generated by org-mode 6.33x in emacs 23

轉載于:https://www.cnblogs.com/visayafan/archive/2011/11/29/2268004.html

總結

以上是生活随笔為你收集整理的【C++】typename的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。