3 回答

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

TA貢獻1827條經驗 獲得超8個贊
試試這個程序
#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還可以使用范圍解析(::)運營商。例如,嘗試用
T get(void){return base<T>::x+2;}
- 3 回答
- 0 關注
- 548 瀏覽
添加回答
舉報