大神們常說不要重復(fù)造輪子,
小編說不要重復(fù)踩坑蜘澜,希望小編踩過得坑大家不要再踩施流。
模板類的編譯和普通類是截然不同的,所以我們在寫模板類的時(shí)候需要注意兩個(gè)常見的語法問題鄙信。
-
模板類的聲明與定義要放在同一文件下瞪醋。
簡而言之,就是所有代碼都要寫在頭文件.h中装诡。
舉個(gè)例子银受,我們寫一般類的做法是
//demo_A.h
class demo_A{
void function_A();
};
//demo_A.cpp
void demo_A::function_A(){/*...*/}
但是践盼,我們在寫模板類的時(shí)候不能這樣做,應(yīng)該都寫在頭文件里
//demo_A.h
template class<T>
class demo_A{
void function_A();
};
template class<T>
void demo_A<T>::function_A(){/*...*/}
為什么會(huì)這樣呢宾巍,我的理解是咕幻,不同的模板是不同的類型,會(huì)生成不同的代碼顶霞,函數(shù)的入口地址也會(huì)不一樣肄程。而編譯器在模板使用之前是不知要要套用哪個(gè)類型的。所以模板類的實(shí)現(xiàn)确丢,脫離具體的使用绷耍,是無法單獨(dú)的編譯的;把聲明和實(shí)現(xiàn)分開的做法也是不可取的鲜侥,必須把實(shí)現(xiàn)全部寫在頭文件里面褂始。
-
模板類繼承中,派生類訪問基類保護(hù)對象要加范圍解析操作符(::)描函,或者加this->
舉個(gè)例子崎苗,我們寫一般類的做法是
class demo_Base{
protected:
int _a;
};
class demo_Derived: public demo_Base{
void functionB(){
_a = 1; //直接訪問基類保護(hù)對象
}
};
但是在模板類中,這樣做就會(huì)報(bào)錯(cuò)舀寓,無法識(shí)別變量_a胆数。
方法一:我們要在_a前加范圍解析操作符::
方法二:在_a前加this->
template class<T>
class demo_Base{
protected:
T _a;
};
template class<T>
class demo_Derived: public demo_Base<T>{
void functionB(){
demo_Base<T>::_a = 1; //方法一
this->_a = 1; //方法二
}
};
我的理解是:因?yàn)榕缮惸0逶诰唧w套用類型之前,編譯器實(shí)際上是不知道基類是誰的互墓,找不到基類的定義與聲明必尼。因此,我們就用范圍解析符或者this指針幫它找到基類中的對象篡撵。