typename的作用
一、與class的區別
template聲明式中,class和typename這兩個關鍵字意義完全相同
template<class T> class Widget;
?
template<typename T> class Widget;
二、什么時候要用typename?比如下面的代碼
template <typename C>?
void print2nd(const C& container)?
{?
? ? if (container.size() >= 2)?
? ? {?
? ? ? ? C::const_iterator iter(container.begin());?
? ? ? ? ++iter;?
? ? ? ? int value = *iter;?
? ? ? ? std::cout << value;?
? ? }?
}
關鍵的地方在于C::const_iterator這個到底是什么?是類中的一個靜態成員變量還是類中的嵌套從屬名稱?這取決于模板的參數C
這里的iterator就是嵌套從屬名稱
template <class T>?
?class test?
?{?
?vector <T> xx;?
?typename vector <T> ::iterator Iterator ; <=====這里必須加typename?
?};?
在這里因為在編譯期無法知道T是什么,也就無法確定iterator是否為某種類型,為了告訴編譯器它是一種類型,必須在前面添加typename?
三、嵌套從屬名稱可能導致解析的困難
template <typename C>?
void print2nd(const C& container)?
{?
? ? C::const_iterator* x;?
}
這里有可能讓編譯誤導是參數C中的某個靜態成員變量與變量x作相乘,所以這里必須在前面添加typename
?
四、不該使用typename的地方
1、typename只用來驗明嵌套從屬類型名稱;其他名稱不該有它存在。
template <typename C>?
void f(const C& container, //不允許使用typename?
? ? ? ?typename C::iterator iter);//一定要使用typename
?
2、“typename必須作為嵌套從屬類型名稱的前綴詞”這一規則的例外是,typename不可以出現在base classes list內的嵌套從屬類型名稱之前,也不可在member initialization list(成員初始化列表)中作為base class修飾符。
template <typename T>?
class Derived: public Base<T>::Nested{//base class list中不允許“typename”?
public:?
? ? explicit Derived(int x)?
? ? ? ? :Base<T>::Nested(x)//mem.init.list中不允許“typename”?
? ? {?
? ? ? ?typename Base<T>::Nested temp;//嵌套從屬類型既不在base class list中也不在mem.init.list中,?
? ? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //作為一個base class修飾符需加上typename?
};
?
五、typename的使用例子
讓我們看一個typename例子:一個function template,他接受一個迭代器,而我們打算為該迭代器指涉的對象做一份復件temp:
template <typename IterT>?
void workWithIterator(IterT)?
{?
? ? typename std::iterator_traits<IterT>::value_type temp(*iter);?
}
也可以這么寫,可以少打幾個typedef typename std::iterator_traits<IterT>::value_type
template <typename IterT>?
void workWithIterator(IterT)?
{?
? ? typedef typename std::iterator_traits<IterT>::value_type value_type;?
? ? value_type temp(*iter);?
?
總結
以上是生活随笔為你收集整理的typename的作用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux与汇编
- 下一篇: 廖雪峰Python 2.X 教程