1. 程式人生 > >模板(template)中typename的使用方法

模板(template)中typename的使用方法

宣告template引數時, 字首關鍵字class和typename可以互換;

使用關鍵字typename標識巢狀從屬型別名稱, 但不需在基類列表和成員初始化列表內使用.


從屬名稱(dependent names): 模板(template)內出現的名稱, 相依於某個模板(template)引數, 如T t;

巢狀從屬名稱(nested dependent names):從屬名稱在class內呈巢狀裝, 如T::const_iterator ci;

非從屬名稱(non-dependent names): 不依賴任何template引數的名稱, 如int value;


如果不特定指出typename, 巢狀從屬名稱, 有可能產生解析(parse)歧義.

任何時候在模板(template)中指涉一個巢狀從屬型別名稱, 需要在前一個位置, 新增關鍵字typename;

否則報錯(GCC): error: need 'typename' before 'T::xxx' because 'T' is a dependent scope


程式碼:

/* 
 * BInsertSort.cpp 
 * 
 *  Created on: 2014.4.17. 
 *      Author: Spike 
 */
      
#include <iostream>  
#include <string>  
#include <vector>  
      
using namespace std;  
      
template<typename T>  
void print2nd(const T& container) {  
    typename T::const_iterator iter(container.begin()); //未加typename, 報錯  
    ++iter;  
    int value = *iter;  
    std::cout << value;  
}  
      
int main () {  
    vector<int> vi = {1,2,3,4,5};  
    print2nd(vi);  
      
    return 0;  
}

輸出:

   2  


例外:巢狀從屬型別名稱, 如果是基類列表(base class list)和成員初值列(member initialization list)中,不使用typename;

程式碼:

/* 
 * BInsertSort.cpp 
 * 
 *  Created on: 2014.4.17 
 *      Author: Spike 
 */
      
#include <iostream>  
#include <vector>  
      
using namespace std;  
      
struct Number {  
    Number(int x) {  
        std::cout << "Number = " << x << std::endl;  
    }  
};  
      
template<typename T>  
struct Base{  
    typedef Number Nested;  
};  
      
template<typename T>  
class Derived: public Base<T>::Nested { //不用typename  
public:  
    explicit Derived(int x) : Base<T>::Nested(x) { //不用typename  
        typename Base<T>::Nested temp(7); //必須使用  
    }  
};  
      
int main () {  
    Derived<int> d(5);  
      
    return 0;  
}

輸出:

Number = 5  
Number = 7

當使用特性類(traits class)時, 必須使用typename, 如

程式碼:

/* 
 * BInsertSort.cpp 
 * 
 *  Created on: 2014.4.17 
 *      Author: Spike 
 */
      
#include <array>  
#include <iostream>  
      
using namespace std;  
      
template<typename T>  
void workWithIter(T iter) {  
    typedef typename std::iterator_traits<T>::value_type value_type; //使用typename  
    value_type temp(*iter);  
    std::cout << "temp = " << temp << std::endl;  
      
}  
      
int main () {  
    std::array<int, 5> ai = {1,2,3,4,5};  
    std::array<int, 5>::iterator aiIter = ai.begin();  
    workWithIter(aiIter);  
    return 0;  
}

輸出:

temp = 1

相關推薦

模板(template)typename的使用方法

宣告template引數時, 字首關鍵字class和typename可以互換; 使用關鍵字typename標識巢狀從屬型別名稱, 但不需在基類列表和成員初始化列表內使用. 從屬名稱(dependent names): 模板(template)內出現的名稱, 相依於某個模板

c++類模板templatetypename使用方法-超級棒

error 最終 all 函數 一段時間 inner 不同 spa n-n 轉載:https://blog.csdn.net/vanturman/article/details/80269081 如有問題請聯系我刪除; 目錄 起因 typename的常見用法

【轉載】C++模板template <typename T>

最新 bsp 針對 www. code mark 方法 固定格式 應該 從一位大佬的程序中看到的,好像挺牛的!! 這個是C++中的模板..template<typename T> 這個是定義模板的固定格式,規定了的..模板應該可以理解到它的意思吧.. 比如你想求

C++ 模板Template的使用

ddc 說明 hid javascrip tro 返回 數據 ret text 1、在c++Template中非常多地方都用到了typename與class這兩個關鍵字,並且好像能夠替換,是不是這兩個關鍵字全然一樣呢? 答:class用於定義類,在模板

OpenCV不同型別Mat的at方法訪問元素時該如何確定模板函式的typename(轉)

自從OpenCV推出了Mat後越來越像是Matlab了,使用起來方便了很多,但是,在用at方法訪問Mat時,如何選用合適的typename型別來訪問相應的Mat元素是個頭疼的問題。 比如:   int Height = 100; int Width = 100; Mat

利用typename使用模板型別引數來定義模板型別的型別的變數

直接上程式碼。 #include <iostream> template<typename T> void PrintStlContainer(T const& co

C++ Template typename、class關鍵字【轉】

在c++Template中很多地方都用到了typename與class這兩個關鍵字,而且好像可以替換,是不是這兩個關鍵字完全一樣呢?         相信學習C++的人對class這個關鍵字都非常明白,class用於定義類,在模板引入c++後,最初定義模板的方法為:tem

前端模板art-template簡單使用方法

1、使用 --- 引用簡潔語法的引擎版本,例如: <script src="dist/template.js"></script>   2、表示式 --- {{ 與 }} 符號包裹起來的語句則為模板的邏輯表示式。 3、輸出表達式     對內容編碼輸出

Thinkphp 3.1.3display方法呼叫其他模組的操作模板的bug

根據thinkphp手冊的說法,假如你在UserAction的index方法中想呼叫AdminAction中info方法所對應的模板,應該這樣寫: $this->display('Admin:info'); 可是當你這樣寫了,你發現什麼了? 對,報錯,提示本模組(U

C++模板template的使用

C++中模板的使用 https://blog.csdn.net/fengbingchun/article/details/51339659 模板(Template)指C++程式設計語言中的函式模板與類模板,是一種引數化型別機制。模板是C++泛型程式設計中不可缺少的一部分。 C++ templ

C++typename和class在宣告模板時的區別

問題 在下面的 template declarations(模板宣告)中 class 和 typename 有什麼不同? template<class T> class Widget; // uses "class" template

關於模板,子類無法訪問父類成員問題的解決方法

問題: 今天研究資料結構,按著書敲程式碼,發現子類中直接呼叫父類成員居然無法通過編譯。 看了好久都沒發現問題,嘗試將父類private屬性改為public,發現也是不行。 解決辦法: 然後我想著用域作

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++ Template typename、class關鍵字

以下轉載自: http://fesir.itpub.net/post/4728/183624 在c++Template中很多地方都用到了typename與class這兩個關鍵字,而且好像可以替換,是不是這兩個關鍵字完全一樣呢?相信學習C++的人對class這個關鍵字都非

Unity SLua 如何調用UnityC#方法

都差不多 public title 接口 如何 1.原理就是通常在Lua框架中所說的,開放一個C#的web接口,或者叫做在Slua框架中註冊函數。2.作用在Lua中調用C#中的方法,這個是在做熱更新中很常用的一種方法,無論是slua,還是lua,都差不多、這

jqueryprop()方法和attr()方法的區別淺析

clas ttr over dex idt pro query selected accesskey jquery1.6中新加了一個方法prop(),一直沒用過它,官方解釋只有一句話:獲取在匹配的元素集中的第一個元素的屬性值。 大家都知道有的瀏覽器只要寫disabled,c

js方法

合並 一段 spl 刪除 元素 font 返回 splice ice Array數組操作  Array.slice() arrayObject.slice(start,end)//返回值:返回一個新的數組,包含從 start 到 end (不包括該元素)的 arra

JQuery$.ajax()方法參數詳解(轉載)

瀏覽器 object 服務器 字符串 false type: 要求為String類型的參數,請求方式(post或get)默認為get。註意其他http請求方法,例如put和 delete也可以使用,但僅部分瀏覽器支持。timeout: 要求為Number類型的參數,設置請求超時時

php靜態方法的使用

time ima 方法 cte count() turn font 應該 面向對象 靜態方法 (1)靜態方法不能訪問這個類中的普通屬性,因為那些屬性屬於一個對象,但可以訪問靜態屬性; (2)從當前類(不是子類)中訪問靜態方法或屬性,可以使用 self 關鍵字,self 指向