3 回答

TA貢獻(xiàn)1868條經(jīng)驗(yàn) 獲得超4個(gè)贊
這是您的兩階段查找。
Base<T>::NO_ZEROFILL(所有大寫(xiě)字母標(biāo)識(shí)符均為boo,宏除外,BTW)是取決于的標(biāo)識(shí)符T。
因?yàn)楫?dāng)編譯器第一次解析模板時(shí),還沒(méi)有實(shí)際的類(lèi)型可以替代T,所以編譯器不會(huì)“知道”什么Base<T>。因此,它無(wú)法知道您假定要在其中定義的任何標(biāo)識(shí)符(可能會(huì)有某種特殊化,T編譯器稍后會(huì)看到),并且您無(wú)法從基類(lèi)中定義的標(biāo)識(shí)符中忽略基類(lèi)限定條件。
這就是為什么您必須寫(xiě)B(tài)ase<T>::NO_ZEROFILL(或this->NO_ZEROFILL)。這告訴編譯器這NO_ZEROFILL是基類(lèi)中的內(nèi)容,它取決于T,并且它只能在實(shí)例化模板時(shí)稍后進(jìn)行驗(yàn)證。因此,它將接受它而不嘗試驗(yàn)證代碼。
當(dāng)通過(guò)為提供實(shí)際參數(shù)實(shí)例化模板時(shí),只能稍后驗(yàn)證該代碼T

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
試試這個(gè)程序
#include<iostream>
using namespace std;
template <class T> class base{
public:
T x;
base(T a){x=a;}
virtual T get(void){return x;}
};
template <class T>
class derived:public base<T>{
public:
derived(T a):base<T>(a){}
T get(void){return this->x+2;}
};
int main(void){
base<int> ob1(10);
cout<<ob1.get()<<endl;
derived<float> ob(10);
cout<<ob.get();
return 0;
}
在T get(void){return this->x+2;}直插U還可以使用范圍解析(::)運(yùn)營(yíng)商。例如,嘗試用
T get(void){return base<T>::x+2;}
- 3 回答
- 0 關(guān)注
- 553 瀏覽
添加回答
舉報(bào)