16.1.3 模板類型形參
類型形參由關鍵字class或typename後接說明符構成。在模板形參表中,這兩個關鍵字具有相同的含義,都指出後面所接的名字表示一個類型。
模板類型形參可作為類型說明符用在模板中的任何地方,與內置類型說明符或類類型說明符的使用方式完全相同。具體而言,它可以用於指定返回類型或函數形參類型,以及在函數體中用於變量聲明或強制類型轉換。
template<class T>
T &Method1(const T &t)
{
T &t1=t;
return t1;
}
template<class T>
T &Method1(const T &t)
{
T &t1=t;
return t1;
}1. typename與class的區別
在函數模板形參表中,關鍵字typename和class具有相同含義,可以互換使用,兩個關鍵字都可以在同一模板形參表中使用。
關鍵字typename是作為標准C++的組成部分加入到C++中的,因此舊的程序更有可能只用關鍵字class。
2. 在模板定義內部指定類型
template<class T>
int Method2(T &t)
{
T::size_type p=T::size_type(10);
p+=10;
return p;
}
template<class T>
int Method2(T &t)
{
T::size_type p=T::size_type(10);
p+=10;
return p;
}
vector<int> vec;
cout<<Method2(vec)<<endl;
vector<int> vec;
cout<<Method2(vec)<<endl;我們不知道size_type是一個類型成員名字還是一個數據成員的名字,默認情況下,編譯器假定這樣的名字指定數據成員而不是類型。
如果希望編譯器將size_type當作類型,則必須顯式告訴編譯器這樣做。
通過在成員前加上關鍵字typename作為前綴,可以告訴編譯器將成員當作類型。當然,這一聲明給實例化模板函數增加了一個職責:那些類型必須具有名為size_type的成員,而且該成員是一個類型。
如果拿不准是否需要以typename指明一個名字是一個類型,那麼指定它是個好主意。在類型之前指定typename沒有害處,因此,即使typename是不必要的,也沒有關系。
template<class T>
int Method2(T &t)
{
typename T::size_type p=T::size_type(10);
p+=10;
return p;
}
摘自 xufei96的專欄