C++中的關鍵字用法---typename


1. typename 關鍵字

  "typename"是一個C++程序設計語言中的關鍵字。當用於泛型編程時是另一術語"class"的同義詞。這個關鍵字用於指出模板聲明(或定義)中的非獨立名稱(dependent names)是類型名,而非變量名。

  (1)class關鍵字的同義詞

    這是一項C++編程語言的泛型編程(或模板編程)的功能,typename關鍵字用於引入一個模板參數,例如:

1 // 定義一個返回參數中較大者的通用函數
2 template <typename T>
3 const T& max(const T& x, const T& y)
4 {
5   return x > y ? x : y;
6 }

  這種情況下,typename可用另一個等效的關鍵字class代替.

  (2)類型名指示符

    Typename關鍵字 告訴編譯把一個特殊的名字解釋成一個類型,在下列情況下必須對一個name使用typename關鍵字:

  •    一個唯一的name(可以作為類型理解),嵌套在另一個類型中;
  •    依賴於一個模板參數,就是說模板參數在某種程度上包含這個name,當模板參數是編譯器在指認一個類型時便會產生誤解
    為了保險起見,應該在所有編譯可能錯把一個type當成一個變量的地方使用typename,如果你的類型在模板參數中是有限制的,那就必須使用typename
 1 template <typename T>
 2 void foo(const T& t)
 3 {
 4     // 聲明一個指向某個類型為T::bar的對象的指針
 5     T::bar * p;
 6 }
 7  
 8 struct StructWithBarAsType
 9 {
10     typedef int bar;
11 }; 
12  
13 int main()
14 {
15     StructWithBarAsType x;
16     foo(x);
17 }

   這段代碼看起來能通過編譯,但是事實上這段代碼並不正確。因為編譯器並不知道T::bar究竟是一個類型的名字還是一個某個變量的名字。究其根本,造成這 種歧義的原因在於,編譯器不明白T::bar到底是不是“模板參數的非獨立名字”,簡稱“非獨立名字”。注意,任何含有名為“bar”的項的類T,都可以 被當作模板參數傳入foo()函數,包括typedef類型、枚舉類型或者變量等。

   為了消除歧義,C++語言標准規定:

   A name used in a template declaration or definition and that is dependent on a template-parameter is assumed not to name a type     unless the applicable name lookup finds a type name or the name is qualified by the keyword typename.
   意即出現上述歧義時,編譯器將自動默認bar為一個變量名,而不是類型名。所以上面例子中的代碼 T::bar * p 會被解釋為乘法,而不是聲明p為指向T::bar類型的對象的指針。如果還有另一個名為StructWithBarAsValue類型,如下:
1 struct StructWithBarAsValue
2 {
3     int bar;
4 };
  那么,編譯器將以完全不同的方式來解釋 T::bar * p 的含義。

  解決問題的最終辦法,就是顯式地告訴編譯器,T::bar是一個類型名。這就必須用typename關鍵字

1 template <typename T>
2 void foo(const T& t)
3 {   
4     // 聲明一個指向某個類型為T::bar的對象的指針
5     typename T::bar * p;
6 }

  這樣,編譯器就確定了T::bar是一個類型名,p也就自然地被解釋為指向T::bar類型的對象的指針了

  (以上來源網址:http://baike.baidu.com/view/1229922.htm)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM