【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 } }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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “SHOT NOTE”新文具,构建虚实之
- 下一篇: 【windows8开发】C++开发Win