typedef和typename關鍵字 (轉)
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
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
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
int main()
{
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- typedef關鍵字
- STL知識準備: 1. C++關鍵字typename (轉)C++
- C語言中關鍵字typedef、enum的使用C語言
- 詳解C++的模板中typename關鍵字的用法C++
- 詳解 C++ 的模板中 typename 關鍵字的用法C++
- #define巨集與列舉以及typedef關鍵字的區別
- js關鍵字和方法JS
- 【轉】C++ static關鍵字C++
- JavaScript 關鍵字和保留字JavaScript
- javascript 作用域和 this 關鍵字JavaScript
- PHP static 關鍵字和 self 關鍵字例項化的區別PHP
- javascript實現關鍵字高亮(轉)JavaScript
- objective-c 關鍵字和概念Object
- abstract關鍵字 super 關鍵字 類與繼承繼承
- JavaScript的關鍵字和保留字大全JavaScript
- Python 標示符和關鍵字Python
- Java中的關鍵字和保留字Java
- Swift 關鍵字Swift
- Synchronized關鍵字synchronized
- JavaScript this關鍵字JavaScript
- Swift —— 關鍵字Swift
- oracle關鍵字Oracle
- Auto關鍵字
- C# 顯式轉換關鍵字 explicitC#
- 索引關鍵字的隱式轉換分析索引
- 為什麼資料和分析是數字化轉型的關鍵?
- c++ operator typename 轉換函式C++函式
- OC訊息機制和super關鍵字
- java中的static和final關鍵字Java
- Java基礎——final和static關鍵字Java
- MySQL 5.7中的關鍵字和保留字MySql
- java final和static關鍵字學習Java
- java基礎----->Static 和 Final 關鍵字Java
- 反編譯使用yield關鍵字的方法 轉編譯
- this 關鍵字的理解--java學習筆記(轉)Java筆記
- Google關鍵字工具Go
- Synchronize 關鍵字原理
- [java]transient關鍵字Java