16.1.2 定義類模板
template <class Type>
class Queue{
public:
Queue();
Type &front();
const Type &front() const;
void push(const Type &);
void pop();
bool empty() const;
private:
};
template <class Type>
class Queue{
public:
Queue();
Type &front();
const Type &front() const;
void push(const Type &);
void pop();
bool empty() const;
private:
};類模板也是模板,因此必須以關鍵字template開頭,後接模板形參表。Queue模板接受一個名為Type的模板類型形參。
除了模板形參表外,類模板的定義看起來與任意其他類相似。類模板可以定義數據成員、函數成員和類型成員,也可以使用訪問標號控制對成員的訪問,還可以定義構造函數和析構函數等等。在類和類成員的定義中,可以使用模板形參作為類型或值的占位符,在使用類時再提供那些類型或值。
與調用函數模板形成對比,使用類模板時,必須對模板形參顯式指定實參。
Queue<int> iq;
Queue<vector<int>> vq;
Queue<int> iq;
Queue<vector<int>> vq;編譯器使用實參來實例化這個類的特定類型版本。
16.1.3 模板形參
像函數形參一樣,程序員為模板形參選擇的名字沒有本質含義。模板形參的命名可以為T,但也可以將它命名為任意名字。
可以給模板形參賦予的唯一含義是區別形參是類型形參還是非類型形參。如果是類型形參,我們就知道該形參表示未知類型,如果是非類型形參,我們就知道它是一個未知值。
如果希望使用模板形參所表示的類型或值,可以使用與對應模板形參相同的名字。
1. 模板形參作用域
模板形參的名字可以在聲明為模板形參之後直到模板聲明或定義的末尾處使用。
模板形參遵循常規名字屏蔽規則。與全局作用域中聲明的對象、函數或類型同名的模板形參會屏蔽全局名字。
typedef double T;
template <typename T> inline //global T was hided.
const T &the_min(const T &v1, const T &v2){
if(compare(v1, v2)==-1)
return v1;
else
return v2;
}
typedef double T;
template <typename T> inline //global T was hided.
const T &the_min(const T &v1, const T &v2){
if(compare(v1, v2)==-1)
return v1;
else
return v2;
}2. 使用模板形參名字的限制
用作模板形參的名字不能在模板內部重用。
正如重用函數形參一樣,模板形參的名字可能在不同模板中重用。
3. 模板聲明
像其他任意函數或類一樣,對於模板可以只聲明而不定義。聲明必須指出函數或類是一個模板。
template <typename T> inline //global T was hided.
const T &the_min(const T &v1, const T &v2);
template <typename T> inline //global T was hided.
const T &the_min(const T &v1, const T &v2);
同一模板聲明和定義中,模板形參的名字不必相同。
每個模板類型形參前面必須帶上關鍵字class或typename,每個非類型形參前面必須帶上類型名字,省略關鍵字或類型說明符是錯誤的。
摘自 xufei96的專欄