16.1.3模板參數
很多時候我們把參數名字定義爲T,但是實際上我們可以使用任何的名字
比如
template <typename DATA>using partNo = BlobA<DATA>;
模板參數和作用域規則。一個模板參數名的可用範圍是在其聲明之後,至模板聲明或定義結束之前。與其他任何名字都一樣,模板參數會隱藏外層作用域中聲明的相同的名字。但是,與大多數其他上下文相同,在模板內不能重用模板參數名:
typedef double A;
template <typename A,typename B>void f(A a,B b)
{
A tmp = a;
double B;//錯誤重複聲明模板參數B
}
因爲上面已經聲明過B 了 typename B,下面又聲明瞭B
同時也要注意temp 的類型 不是 double 了 ,是模板的實參類型
模板聲明:
模板聲明必須包含模板參數
template <typename T> int compare(const T&, const T&);
template <typename T> class Blob;
與函數一樣,聲明中的模板名字,不一定要和定義的時候相同
template <typename T> T calc(const T&,const T&);
template <typename U> U calc(const U&,const U&);
比如說這兩個模板函數其實就是一樣的這麼寫會出現重複定義
使用類的類型成員
比如說我們可以使用string::size_type ,我們知道string類型,但是對於模板T::mem來說,卻不知道T的類型
默認情況下,c++語言假定通過作用域運算符訪問的名字不是類型。因此如果我們希望使用一個模板類型參數的類型成員,就必須顯示的告訴編譯器該名字是一個類型。我們通過使用typename來實現這一點。
template <typename T>
typename T::value_type top(const T&c)
{
if(!c.empty())
return c.back();
else
return typename T::value_type();
}
我們的top函數期待一個容器類型的實參,它使用typename指明返回類型並且在c中沒有元素時候生成一個值初始化的元素返回給調用者。
然後我們看代碼
int main()
{
int b;
std::vector<int> vec;
top(vec);
// std::cout<<partNo<int>::count()<<std::endl;
return 0;
}
如果傳入 vec這是正確的 如果傳入 a 因爲是int所以是錯誤的這全都歸功與我們提前告知了編譯器