【C++】typename
?
參考《Effective C++》條款42:Understand the two meaning of typename
Table of Contents
- 1 模板參數(shù)列表中與class關(guān)鍵字可相互替換
- 2 嵌套從屬名稱(nested dependent names)
- 3 是嵌套從屬名稱但不用加typename的兩種情況
1 模板參數(shù)列表中與class關(guān)鍵字可相互替換
?
template<typename T> template<class T> 是一樣的2 嵌套從屬名稱(nested dependent names)
假如template內(nèi)出現(xiàn)的名稱如果依賴于某個(gè)模板參數(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ù)表示一個(gè)容器類型,則我們知道t::const_iterator一個(gè)依賴模板參數(shù)并且在容器內(nèi)部,所以t::const_iterator是一個(gè)嵌套從屬名稱。
在我們知道t是什么之前沒有辦法可以知道t::const_iterator是否是一個(gè)類型,因?yàn)橛羞€可能是個(gè)靜態(tài)(static)成員變量,考慮下面的例子:
?
template <typename T> void myPrint(const T& t){t::const_iterator * x; }如果const_iterator是t的靜態(tài)成員變量,則上面的t::const_iterator * x;中的*表示乘法,如果是個(gè)類型則表示聲明一個(gè)指向t::const_iterator類型的指針。
從而給編譯器造成困惑(因?yàn)槲覀儾恢纓是什么)。
C++有個(gè)規(guī)定:當(dāng)解析器在模板中遇到一個(gè)嵌套從屬名稱時(shí)便假定這個(gè)名稱不是類型,除非你用關(guān)鍵字typename指定它是:
?
template <typename T> void myPrint(const T& t){typename t::const_iterator * x; //這樣便不會(huì)造成困惑了 }同理不僅在內(nèi)部,在參數(shù)列表里也是:
?
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 } }Date: 2011-11-29 18:49:57
HTML generated by org-mode 6.33x in emacs 23
轉(zhuǎn)載于:https://www.cnblogs.com/visayafan/archive/2011/11/29/2268004.html
總結(jié)
以上是生活随笔為你收集整理的【C++】typename的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: “SHOT NOTE”新文具,构建虚实之
- 下一篇: 文件上传下载流程设计