指针在导出模板类

问题描述:

没有见过我的模板类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>::时,一切正常。为什么我得到这个错误,当头受保护,我使用公共继承?

+5

'List '是一个从属基类,使用'this-> head'而不是 –

发生这种情况是因为“element<T>* tmp”的赋值没有减少T参数,所以tmp被称为非独立名称。另一方面,List依赖于 模板参数T,所以List被称为依赖名称。

问题:当向非依赖名称(如头部)查找 时,编译器不查找依赖基类(如List)。

解决方案:

  1. 变化从头部调用这个 - >头。由于这总是隐含地依赖于模板,因此this-> head是相关的,并且因此推迟查找直到模板实际被实例化,在该点考虑所有基类。
  2. 将呼叫从tmp = head更改为element<T>::head。这是您当前的解决方案,但请小心...... 如果头部是虚拟功能,这可能不会给您想要的东西,因为它禁止虚拟的 调度机制。