template<typename(class) T>
class Widget { ... };
class 和 typename 均可用于聲明模闆的形式類型參數,但 typename 能更清楚地表示: T 可以是任何 類型;不必是一個類。
為了避免潛在的模糊解析,編譯器要求在依賴形式類型參數的類型名字之前使用 typename 。這樣的類型被稱為依賴類型 。示例:
<code>template</code><code><</code><code>typename</code> <code>C></code>
<code>bool</code> <code>lastGreaterThanFirst(</code><code>const</code> <code>C& container) {</code>
<code> </code><code>if</code> <code>(container.empty())</code><code>return</code> <code>false</code><code>;</code>
<code> </code><code>typename</code> <code>C::const_iterator begin(container, begin());</code>
<code> </code><code>typename</code> <code>C::const_ierator end(container.end());</code>
<code> </code><code>return</code> <code>*--end > *begin;</code>
<code>}</code>
在這個例子裡,局部變量 begin 和 end 的類型是 C::const_iterator 。 const_iterator 是依賴形式類型參數 C 的一種類型。因為 C::const_iterator 是一種依賴類型,你被要求在它之前放上 typename 這個詞。(一些編譯器錯誤地接受沒有 typename 的代碼,但這樣的代碼不可移植。)
---------------------------------------------------
歡迎轉載,請注明作者和出處
本文轉自 zhenjing 部落格園部落格,原文連結:http://www.cnblogs.com/zhenjing/archive/2011/01/21/typename.html ,如需轉載請自行聯系原作者