1. 程式人生 > >C++ typename關鍵字的作用

C++ typename關鍵字的作用

引用講解typename作用部分:

2、型別解釋Typename

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

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

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

保險起見,你應該在所有編譯器可能錯把一個type當成一個變數的地方使用typename。就像下面的例子中

typedef COne::one_value_type two_value_type;在編譯CTwo類時編譯器就可能把‘COne::one_value_type’當成一個變數,因為‘/*2’處我們使用了typename,所以編譯器就知道了它是一個型別,可以用來宣告並建立例項。

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

#include "typeinfo"  // for typeid()operator


using namespace std;
template
struct COne
{   // default member ispublic
    typedef TPone_value_type;
};
template    // 用一個模板類作為模板引數,這是很常見的
struct CTwo
{
    //請注意以下兩行
    // typedefCOne::one_value_type two_value_type; // *1 

    typedeftypename COne::one_value_type two_value_type;//*2 

};
// 以上兩個模板類只是定義了兩個內部的public型別, 但請注意第二個類CTwo的two_value_type型別
// 依賴COne的one_value_type, 而後者又取決於COne模板類例項化時傳入的引數型別.
int main()
{
    typedef COneOneInt_type;
    typedefCTwo< OneInt_type > TwoInt_type;
   TwoInt_type::two_value_type i;
    int j;
    if (typeid(i) == typeid(j) )   //如果i是int型變數
       cout << "Right!" <<endl;   // 列印Right
   return;
}

以上例子在Linux下用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)
,這樣編譯
器就可以順利的工作了.

相關推薦

C++ typename關鍵字作用

引用講解typename作用部分: 2、型別解釋Typename Typename關鍵字告訴了編譯器把一個特殊的名字解釋成一個型別,在下列情況下必須對一個name使用typename關鍵字: 1. 一個唯一的name(可以作為型別理解),它巢狀在另一個型別中的。 2. 依賴於一個模板引數,就是說:模板引

C++ static關鍵字作用

esp 接收 name names 分配 c++ spa 成員函數 它的 (1)函數體內static變量的作用範圍為該函數體,不同於auto變量,該變量的內存只被分配一次,因此其值在下次調用時仍維持上次的值; (2)在模塊內的static全局變量可以被模塊內所用函數訪問,

C++ using關鍵字作用 (過載父類函式)

1.在當前檔案中引入名稱空間 這是我們最熟悉的用法,例如:using namespace std; 2.在子類中使用 using 宣告引入基類成員名稱(參見C++ primer) 在private或者protected繼承時,基類成員的訪問級別在派生類中更受限:

C++中static關鍵字作用總結

可見性 apple 局部變量 內存 父類靜態 初始化 ati 退出 變量存儲 1.先來介紹它的第一條也是最重要的一條:隱藏。(static函數,static變量均可) 當同時編譯多個文件時,所有未加static前綴的全局變量和函數都具有全局可見性。舉例來說明。同時編譯兩個源

C ------ static 關鍵字作用

不同 普通 範圍 oid 修飾 數據 error -- 關鍵字 首先要理解生存周期與作用域的區別: 生存周期: 變量從定義到銷毀的時間範圍。存放在全局數據區的變量的生存周期存在於整個程序運行期間,而存放在棧中的數據則隨著函數等的作用域結束導致出棧而銷毀,除了靜態變量之外的局

C++中關鍵字static的作用

對象 想要 關鍵字 局部作用域 blog 個數 初始化 ext lte 1、定義局部靜態變量,存放在全局數據區的靜態變量區。初始化的時候自動初始化為0; 其作用域為局部作用域,當定義它的函數或語句塊結束時,其作用域隨之結束。 2、static定義全局變量的時候,這個全局變量

C#: static關鍵字作用

轉:C#: static關鍵字的作用 tatic意思是靜態,可以修飾類、欄位、屬性、方法 標記為static的就不用建立例項物件呼叫了,可以通過類名直接點出來 static三種用法: 1.用於變數前,表示每次重新使用該變數所在方法、類或自定義類時,變數的值為程式這次執行最後一次為變數

C++的關鍵字整合及作用說明

1. asm asm (指令字串):允許在 C++ 程式中嵌入彙編程式碼。 2. auto auto(自動,automatic)是儲存型別識別符號,表明變數"自動"具有本地範圍,塊範圍的變數宣告(如for迴圈體內的變數宣告)預設為auto儲存型別。 3. bool

C++中static關鍵字作用

@著作權歸作者所有:來自CSDN部落格作者大鬍子的艾娃的原創作品,如需轉載,請註明出處,否則將追究法律責任。 如有錯誤的地方歡迎指正,謝謝! 一、 static宣告全域性靜態變數和區域性靜態變數 1、static宣告全域性靜態變數 該全域性變數只能供本模組使用,

C++中的typename關鍵字

在C++中typename除了用於在定義模板函式和模板類中來替代關鍵字class,例如template<class T>換成template<typename T>意外,typename還可以用來做型別的定義。 注意:下面的程式碼是有問題的 temp

c++的override關鍵字作用

描述:override保留字表示當前函式重寫了基類的虛擬函式。 目的:1.在函式比較多的情況下可以提示讀者某個函式重寫了基類虛擬函式(表示這個虛擬函式是從基類繼承,不是派生類自己定義的);2.強制編譯器檢查某個函式是否重寫基類虛擬函式,如果沒有則報錯。 用法:在類的成員

C++中typename關鍵字的使用方法和注意事項

目錄起因近日,看到這樣一行程式碼:typedef typename __type_traits<T>::has_trivial_destructor trivial_destructor; 雖說已經有多年C++經驗,但上面這短短一行程式碼卻看得我頭皮發麻。看起來它

Effective C++筆記之八:template中的class、typename關鍵字

       template 宣告式中,class 和 typename 這兩個關鍵字意義完全相同 template<class T> class Widget; template<typename T> class Widget;    

C語言中關鍵字作用(const和static和extern)

儲存型別關鍵字(4個): auto: 宣告自動變數,現在一般不用(auto int a;和int a;一樣) register: 宣告暫存器變數 static: 宣告靜態變數。該變數宣告時系統所分配的

C/C++中static關鍵字作用總結(轉)

源地址 C/C++中static關鍵字作用總結 隱藏 先來介紹它的第一條也是最重要的一條:隱藏(static函式,static變數均可) 當同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性。舉例來說明。同時編譯兩個原始

Serializable在C#中的作用及其優點

p s mst access pen eat mat zab ref hal 原文發布時間為:2009-10-27 —— 來源於本人的百度文章 [由搬家工具導入]Serializalbe - Enable the object can be Serialized into

static在C/C++中的作用-(轉自華山大師兄)

運行時 str 如果 字符數 class 但我 靜態成員 var 使用 1.先來介紹它的第一條也是最重要的一條:隱藏。(static函數,static變量均可) 當同時編譯多個文件時,所有未加static前綴的全局變量和函數都具有全局可見性。舉例來說明。同時編譯兩個源文件

c# using的作用

定義 raw 不能 隱藏 解決方案 可能 調用 fin use using 關鍵字有兩個主要用途: (一).作為指令,用於為命名空間創建別名或導入其他命名空間中定義的類型。 (二).作為語句,用於定義一個範圍,在此範圍的末尾將釋放對象。 using指令

volatile關鍵字作用

獲取 語義 可見性 操作 指令重排序 寫入 strong 修飾 每次 (1)保證可見性:多線程主要圍繞可見性和原子性兩個特性而展開,使用volatile關鍵字修飾的變量,保證了其在多線程之間的可見性,即每次讀取到volatile變量,一定是最新的數據。 當一個共享變量被vo

關於C#的關鍵字與上下文關鍵字

分代 cnblogs tab order splay width ges blog .cn 1、C#關鍵字:用來定義C#語言的字符串記號,它們是對編譯器具有特殊意義的預定義保留標識符。 (註:1.、鍵字不能用做變量名或任何其他形式的標識符,但@關鍵字即可使用。