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 关注
- 526 浏览
添加回答
举报