typedef和typename關鍵字 (轉)

gugu99發表於2007-08-17
typedef和typename關鍵字 (轉)[@more@]

1、型別說明typedef

  型別說明的格式為:
  typedef  型別 定義名;
  型別說明只定義了一個資料型別的新名字而不是定義一種新的資料型別。定義名錶示這個型別的新名字。
  例如: 用下面語句定義整型數的新名字:
  typedef int SIGNED_INT;
  使用說明後, SIGNED_INT就成為int的同義詞了, 此時可以用SIGNED_INT 定
義整型變數。
  例如:  SIGNED_INT i, j;(與int i, j等效)。
  但 long SIGNED_INT i, j; 是的。
  typedef同樣可用來說明結構、聯合以及列舉和類。
  說明一個結構的格式為:
  typedef struct{
  資料型別  成員名;
  資料型別  成員名;
  ...
  } 結構名;
  此時可直接用結構名定義結構變數了。例如:
  typedef struct{
  char name[8];
  int class;
  char subclass[6];
  float math, phys, chem, engl, biol;
  } student;
  student Liuqi;
  則Liuqi被定義為結構陣列和結構指標。 
2、型別解釋Typename

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

1.  一個唯一的name(可以作為型別理解),它巢狀在另一個型別中的。

2.  依賴於一個模板引數,就是說:模板引數在某種程度上包含這個name。當模板引數使編譯器在指認一個型別時產生了誤解。

 :NAMESPACE PREFIX = O />

保險期間,你應該在所有編譯器可能錯把一個type當成一個變數的地方使用typename。就像上面那個例子中的T::id,因為我們使用了typename,所以編譯器就知道了它是一個型別,可以用來宣告並建立例項。

 

給你一個簡明的使用指南:如果你的型別在模板引數中是有限制的,那你就必須使用typename.

 

#include
#include  // for typeid() operator

using namespace std;

template
struct COne {   // default member is public
    typedef TP one_value_type;
};

template    // 用一個模板類作為模板引數, 這是很常見的
struct CTwo {
    // 請注意以下兩行
    // typedef COne:one_value_type two_value_type;   // *1
    typedef typename COne:one_value_type two_value_type; // *2 
};

// 以上兩個模板類只是定義了兩個內部的public型別, 但請注意第二個類CTwo的two_value_type型別
// 依賴COne的one_value_type, 而後者又取決於COne模板類例項化時傳入的引數型別.

int main()
{
    typedef COne OneInt_type;
    typedef CTwo< OneInt_type > TwoInt_type;
    TwoInt_type::two_value_type i;
    int j;
    if ( typeid(i) == typeid(j) )   // 如果i是int型變數
     cout << "Right!" << endl;   // 列印Right
    return;
}
以上例子在下用G++ 2.93編譯透過, 結果列印"Right". 但是如果把*1行的註釋號去掉, 註釋
*2行, 則編譯時報錯, 編譯器不知道COne:one_value_type為何物. 通常在模板類引數中的型別到
例項化之後才會顯露真身, 但這個CTwo類偏偏又要依賴一個已經存在的COne模板類, 希望能夠預先
保證CTwo::two_value_type與COne:one_value屬於同一型別, 這是就只好請typename出山, 告訴
編譯器, 後面的COne:one_value_type是一個已經存在於某處的型別的名字(type name), 這樣編譯
器就可以順利的工作了.

使用typename來代替class

詳細介紹了typename的使用方法之後,我們現在就可以選擇typename來取代class宣告,這樣可以增加的清晰度。

//: C03:UsingTypename.cpp

// Using 'typename' in the template argument list

template class X { };

int main()

{

X x;

} ///:~

 

你當然也會看到許多類似的程式碼沒有使用typename關鍵字,因為模板概念誕生之後很久了,才有了typename關鍵字的加入。

 

用typename自定義一個型別

要知道typename關鍵字不會自動的typedef,

typename Seq::iterator It;

只是宣告瞭一個Seq::iterator型別的變數,如果你想定義一個新型別的話,你必須這樣:

typedef typename Seq::iterator It;


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-963099/,如需轉載,請註明出處,否則將追究法律責任。

相關文章