2011-09-20 53 views
2
OMStatic.h 
template<class Concept> class OMStaticArray : 
      public OMAbstructContainer<Concept> { 
protected: 
    Concept *theLink; 
    int count; 

    void* AllocateMemory(int size); 
    bool ReleaseMemory(void* pMemory); 
    //... 
}; 

OMCollec.h 

template<class Concept> class OMCollection : 
    public OMStaticArray<Concept>{ 
public: 

void add(Concept p) { 
    //... 


> if (this->count >= size) 

    //... 
} 

在上面的代碼範圍內聲明,類OMCollection從OMStaticArray繼承,我的理解是,我們可以直接訪問受保護的變量,但我得到一個錯誤「計數範圍未聲明」。如果我用這個 - >計數錯誤沒有顯示。爲什麼我面臨這個錯誤,它用於在VxWorks 5.5中進行編譯,現在我已經遷移到了Vxworks6.8,如果在它之前不使用「prefix」,我正面臨這個錯誤? behnind這是什麼原因?請澄清。變量未使用模板繼承

謝謝!

+0

有沒有另一個'count'的地方? – Skizz

回答

3

這在C++ FAQ中最好說明:http://www.parashift.com/c++-faq-lite/templates.html#faq-35.19

套用:

OMCollection<Concept>::add(),名稱count不 依賴模板參數Concept,所以count稱爲 非依賴的名字。另一方面,OMStaticArray<Concept>是 依賴於模板參數Concept因此OMStaticArray<Concept> 被稱爲從屬名稱

這裏的規則:編譯器看起來不是依賴基類 (如OMStaticArray<Concept>)尋找非依賴的名字 (如count)時。

至於爲什麼在一個較舊的編譯器中編譯,原因可能是舊編譯器不完全符合C++標準。

+0

你知道爲什麼在VxWorks5.5中使用out「this」的相同代碼? – venkysmarty

+0

有趣。我不知道這個規則的理性是什麼? – Skizz

+0

這是兩階段名稱查找的副作用。如果沒有這個規則,你不能在第一階段查找任何不合格的名字,因爲在基類已知的情況下,你會發現任何名字都必須在第二階段再次查找。這會使第一階段變得毫無用處。 – MSalters