模板(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++類模板template中的typename使用方法-超級棒
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.3中display方法呼叫其他模組的操作模板的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 如何調用Unity中C#方法
都差不多 public title 接口 如何 1.原理就是通常在Lua框架中所說的,開放一個C#的web接口,或者叫做在Slua框架中註冊函數。2.作用在Lua中調用C#中的方法,這個是在做熱更新中很常用的一種方法,無論是slua,還是lua,都差不多、這
jquery中prop()方法和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 指向