任意類(模板或者是飛模板)可以擁有類模板或函式模板的成員,這種成員成為成員模板,成員模板不能為虛。成員模板的乙個例子是標準容器的assign成員,接受兩個迭代器的assign版本使用模板形參表示其迭代器形參的型別。另乙個例子就是接受兩個迭代器的容器建構函式。
1 定義成員模板
模板成員宣告看起來像任意模板的宣告一樣。
template class queue
template void assign(iter,iter);
private:
template void copy_elems(iter,iter);
};template template void queue::assign(iter beg,iter end)
template template void queue::copy_elems(iter beg,iter end)
}
成員宣告的開頭是自己的模板形參表。建構函式和assign函式各有乙個模板型別形參,這些函式使用這些型別形參作為其函式形參的型別,他們函式
形參指明要複製元素範圍的迭代器。
2 在類外定義成員模板
在類模板作用域外部定義成員模板的時候,那必須包含兩個模板形參表:
template template void queue::assign(iter beg,iter end)
當成員模板時類模板的成員時,它的定義必須包含類模板形參以及自己的模板形參。
首先是類模板形參表,後面接著是自己模板形參表。
assign函式定義的開頭為:
template template
第乙個模板形參表template 為類模板的,第二個模板形參表template 是成員模板的。
3 成員模板的例項化
成員模板只有在程式使用時才例項化。類模板的成員模板的例項化要比類模板的普通成員函式的例項化要複雜一些。
成員模板有兩種模板形參:(1)由類定義的(2)由成員模板本身定義的
類模板形參由呼叫函式的物件的型別確定,成員定義的模板形參的行為與普通函式模板一樣。這些形參都通過常規模版實參推斷確定。
short a[4] = ;
queueqi(a,a+4);
vectorvi(a,a+4);
qi.assign(vi.begin(),vi.end());
因為所構造的是queue型別的物件,我怕們知道編譯器將為queue例項化基於迭代器建構函式。該建構函式本身模版形參的型別由編譯器根據a和a+4的型別推斷,而該型別為short指標。因此,qi的定義例項化:
void queue::queue(short *,short *);
對assign的呼叫將例項化qi的成員。qi具有queue型別,因此,這個呼叫將例項化名為assign的queue成員。該函式為函式模版,想起他任意的函式模版一樣,編譯器從傳給呼叫者的實參推斷assign的模版實參,推斷得到的型別是vector::iterator,這個呼叫例項化:
void queue::assign(vector::iterator,vector::iterator);
c 學習筆記之成員模板
任意類 模板或者是飛模板 可以擁有類模板或函式模板的成員,這種成員成為成員模板,成員模板不能為虛。成員模板的乙個例子是標準容器的assign成員,接受兩個迭代器的assign版本使用模板形參表示其迭代器形參的型別。另乙個例子就是接受兩個迭代器的容器建構函式。1 定義成員模板 模板成員宣告看起來像任意...
C 學習筆記之 模板
目錄類模板 模板是泛型程式設計的基礎,泛型程式設計即以一種獨立於任何特定型別的方式編寫 即不具體制定資料型別 模板是建立泛型類或函式的藍圖或公式 include include using namespace std 函式模板實現通用資料型別交換 template t屬於通用資料型別 void my...
C 學習筆記之靜態成員
靜態成員就是在成員變數和成員函式前加上關鍵字static,稱為靜態成員。靜態成員分為 class person int person m a 10 int person m b 10 void test01 intmain class person static int m a 靜態成員變數 int...