模板引數可以是表示型別的型別形參,也可以是表示常量表示式的非型別形參。
型別形參:出現在模板引數列表中,跟在關鍵字 class 或 typename 之後定義,例如,class t 是名為 t 的型別形參,在這裡 class 和 typename 沒有區別。
非型別形參:就是用乙個常量作為類(函式)模板的乙個引數,在類(函式)模板中可將該引數當成常量來使用。
**示例:
namespace bit
const t&
operator
(size_t index)
const
size_t size()
const
bool
empty()
const
private
: t _array[n]
; size_t _size;};
}
注意:
浮點數、類物件以及字串是不允許作為非型別模板引數的。
非型別的模板引數在編譯期就能確認結果。
要點總結
模板在定義時候可以在尖括號裡定義乙個常量,作為引數。例如:template < class t, size_t n = 10 >。
2、傳入的時候必須是const型別的資料。
通常用作給某個陣列傳長度。
有如下類模板定義:
template<typename t>
class
bignumber
long n;
public
:bignumber
(ti):n
(i) bignumberoperator+(bignumberb)
};
已知b1、b2是bignumber的兩個物件,則下列表示式中錯誤的是( )。
a.b1+b2
b.b1+3
c.3+b1
d.3+3
標準答案:c
答案解析:
c++運算子的過載有兩個方式,一種是做為成員函式,另一種是做為友無函式。前種c++預設省略第乙個引數(事實上是物件本身),而後一種是所有的引數都要寫全。比如對加法的過載:成員方式為coperator operator+(coperator &op);
,在呼叫的過程中我們可以理解為result=operator+(op);
友元方式為friend coperator operator-(coperator &op1, coperator &op2);
,在呼叫的過程中我們可以理解為result=operator-(op1, op2);
。
成員函式的話有個this指標,所以要想呼叫成員函式operator+ 的話前面的變數必須要是類物件
選項解析:
a.b1+b2 : 是bignumber(b1)+bignumber(b2)
b.b1+3 : 是bignumber(b1)+bignumber(3)
c.3+b1 : 整數3與b1相加時,3是int型,b1是bignumber<t>型,int型不能和別的型做運算。常數3無法匹配到此模版中的+過載函式,編譯器無法識別
d.3+3 : 就是正常的3+3
C 非型別模板引數
對於函式模板與類模板,模板引數並不侷限於型別,普通值也可以作為模板引數。在基於型別引數的模板中,你定義了一些具體的細節來加以確定 直到 被呼叫時這些細節才被真正的確定。但是在這裡,我們面對的是這些細節是值,而不是型別,當要使用基於值的模板時,必須顯式地指定這些值,才能夠對模板進行例項化。在上篇文章 ...
C 非型別模板引數
對 於函式模板與類模板,模板引數並不侷限於型別,普通值也可以作為模板引數。在基於型別引數的模板中,你定義了一些具體的細節來加以確定 直到 被調 用時這些細節才被真正的確定。但是在這裡,我們面對的是這些細節是值,而不是型別,當要使用基於值的模板時,必須顯式地指定這些值,才能夠對模板進行例項 化。在上篇...
C 非型別模板引數
對於函式模板與類模板,模板引數並不侷限於型別,普通值也可以作為模板引數。在基於型別引數的模板中,你定義了一些具體的細節來加以確定 直到 被呼叫時這些細節才被真正的確定。但是在這裡,我們面對的是這些細節是值,而不是型別,當要使用基於值的模板時,必須顯式地指定這些值,才能夠對模板進行例項化。在上篇文章 ...