程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 第16章 模板與泛型編程(3)

第16章 模板與泛型編程(3)

編輯:C++入門知識

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的專欄
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved