指针在导出模板类
问题描述:
没有见过我的模板类List:指针在导出模板类
template<class T>
class List{
protected:
element<T>* head;
//...
};
,我有模板类设置从列表继承:
template<class T>
class Set: public List<T>{
public:
void insert(const T& t){
if(!has(t))
pushFront(t);
}
bool has(const T& t){
bool is=false;
element<T>* tmp=head;
while(tmp && !is){
if(Comparator::compare(t, tmp->key))
is=true;
tmp=tmp->next;
}
return is;
}
};
我的问题是,当我想使用element<T>* tmp=head;
行,没有其他任何东西,我得到错误'head' was not declared in this scope
,但是当我在此行(element<T>* tmp=List<T>::head;
)之前添加List<T>::
时,一切正常。为什么我得到这个错误,当头受保护,我使用公共继承?
答
发生这种情况是因为“element<T>* tmp
”的赋值没有减少T参数,所以tmp被称为非独立名称。另一方面,List依赖于 模板参数T,所以List被称为依赖名称。
问题:当向非依赖名称(如头部)查找 时,编译器不查找依赖基类(如List)。
解决方案:
- 变化从头部调用这个 - >头。由于这总是隐含地依赖于模板,因此this-> head是相关的,并且因此推迟查找直到模板实际被实例化,在该点考虑所有基类。
- 将呼叫从tmp = head更改为
element<T>::head
。这是您当前的解决方案,但请小心...... 如果头部是虚拟功能,这可能不会给您想要的东西,因为它禁止虚拟的 调度机制。
'List'是一个从属基类,使用'this-> head'而不是 –