template<class T> class Widget;
template<typename T> class Widget;
這兩種聲明區別不大。但在一些場合,必須使用typename。
template<typename C> // typename/class都行<br />void f(const C& container, // 直接用C就好<br /> typename C::iterator iter); // 必須加typename在C前面
iterator是定義在C內部的類型。這樣的類型有個名字:nested dependent name。
int和float不依賴任何類型而存在,它們的名字:non-dependent name。
C++在涉及模板中的nested dependent name時,有這麼三條規定:
template<typename T><br />class Derived: public Base<T>::Nested { // 基類列表不能用typename修飾<br />public:<br />explicit Derived(int x)<br />: Base<T>::Nested(x) // 成員初始化列表不能用typename修飾<br />{<br />typename Base<T>::Nested temp; // 除了上面兩種情況,都要用typename修飾<br />...<br />}<br />};
還有一種typename的常見用法:
template<typename IterT><br />void workWithIterator(IterT iter)<br />{<br />typedef typename std::iterator_traits<IterT>::value_type value_type;<br />value_type temp(*iter);<br />...<br />}