2015-06-21 100 views
1

沒有見過我的模板類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'而不是 –

回答

0

發生這種情況是因爲「element<T>* tmp」的賦值沒有減少T參數,所以tmp被稱爲非獨立名稱。另一方面,List依賴於 模板參數T,所以List被稱爲依賴名稱。

問題:當向非依賴名稱(如頭部)查找 時,編譯器不查找依賴基類(如List)。

解決方案:

  1. 變化從頭部調用這個 - >頭。由於這總是隱含地依賴於模板,因此this-> head是相關的,並且因此推遲查找直到模板實際被實例化,在該點考慮所有基類。
  2. 將呼叫從tmp = head更改爲element<T>::head。這是您當前的解決方案,但請小心...... 如果頭部是虛擬功能,這可能不會給您想要的東西,因爲它禁止虛擬的 調度機制。