網(wǎng)站交換鏈接怎么做百度競(jìng)價(jià)個(gè)人開戶
一 類模板
template <class T或者typename T>
class 類名
{
..........
}
1.1 兩種不同的實(shí)現(xiàn)
- 在以下的兩種實(shí)現(xiàn)中,其實(shí)第一種叫做成員函數(shù)模板,并不能稱為類模板
- 因?yàn)檫@種實(shí)現(xiàn),我們?cè)谡{(diào)用時(shí),并不需要實(shí)例化為Product這個(gè)類指定指定特定類型。
// 實(shí)現(xiàn)1
class Product
{
public:template<typename T>void setProduct(const T& t){qDebug()<<t;}
};
- 但下面這種實(shí)現(xiàn)才是真正的類模板實(shí)現(xiàn)
- 這種的問題是每次實(shí)例化都必須指定類型T,這意味著每個(gè)?
ProductA
?實(shí)例都綁定到了一個(gè)特定類型上。
template<typename T>
class ProductA
{
public:void setProduct(const T& t){qDebug()<<t;}
};
ProductA<int> procduct;
procduct.setProduct(10);
1.2 優(yōu)缺點(diǎn)
- 如果你需要一個(gè)類能夠處理多種不同類型的數(shù)據(jù),并且這些數(shù)據(jù)類型在設(shè)計(jì)時(shí)是未知的,那么?示例 1?更加合適。
- 如果你需要一個(gè)類只處理一種特定類型的數(shù)據(jù),并且希望在類的設(shè)計(jì)時(shí)就明確這一點(diǎn),那么?示例 2?更加合適。
1.3 類模板類外定義
- 聲明
template<typename T>
class SumTemplate
{
public:T sum(T a, T b);T max(T a, T b);
};
- 定義:在定義時(shí)不但要加載類名的限定符,還要聲明模板參數(shù),以及傳遞模板參數(shù)
template<typename T>
T SumTemplate<T>::sum(T a, T b)
{return a + b;
}template<typename T>
T SumTemplate<T>::max(T a, T b)
{return a > b ? a : b;
}
1.4 模板類
- 實(shí)例化的模板也就是模板類,模板類是一個(gè)由模板生成的類
SumTemplate<int> templateA;qDebug()<<templateA.sum(1024,1024);qDebug()<<templateA.max(1024,512);SumTemplate<float> templateB;qDebug()<<templateB.sum(1024,1024);qDebug()<<templateB.max(1024,512);
二 模板類定義不能定義在cpp中
- 如果我們將模板類定義在cpp中,那么我們就會(huì)遇到未定義的錯(cuò)誤行為
- 對(duì)于模板類的函數(shù)聲明和實(shí)現(xiàn)必須放在同一個(gè).h里面
2.1 原因?
- 延遲實(shí)例化: 首先當(dāng)編譯器遇到類模板的聲明時(shí),并不會(huì)為這個(gè)類模板創(chuàng)建任何的代碼,因?yàn)轭惸0宓膶?shí)例化是在調(diào)用它時(shí)才會(huì)產(chǎn)生對(duì)應(yīng)的代碼。
- 如果成員函數(shù)定義位于類模板定義之外,比如在另一個(gè)
.cpp
文件中,那么就需要顯式地實(shí)例化這些成員函數(shù)。這是因?yàn)榫幾g器在處理模板類實(shí)例化時(shí),需要知道成員函數(shù)的實(shí)現(xiàn)細(xì)節(jié)。如果沒有顯式實(shí)例化,編譯器可能無法找到這些成員函數(shù)的定義。(也就是在編譯階段無法知道函數(shù)的具體細(xì)節(jié)) - 當(dāng)成員函數(shù)定義直接放在類模板的定義中時(shí),編譯器可以在任何實(shí)例化該模板類的地方看到這個(gè)成員函數(shù)的定義。這種方式下,不需要顯式實(shí)例化成員函數(shù),編譯器會(huì)在需要的時(shí)候自動(dòng)生成特定類型的版本。
2.2?解決
- 我們可以提前在.cpp里面顯示指定模板類的類型,但這種方式不推薦使用
template class SumTemplate<int>;
template class SumTemplate<float>;