2009-10-27 64 views
1

Im再次陷入模板。C++模板遞歸 - 如何解決?

說,我想實現一個guicell系統。每個guicell可以包含一些孩子guicells。到目前爲止,樹形結構如此。在std-C++中我會去stgg。像:

template <typename T> 
class tree 
{ 
public: 

    void add (T *o)  { _m_children.push_back (o); } 
    void remove (T *o) { ... }; 

    list<T*> _m_children; 
}; 

class _cell : public tree<_cell> 
{ 
public: 
    _cell()   { x = 0; y =0; } 
    long    x,y; 
}; 

但現在我想進一步,並使細胞引用如果編碼器希望如此。所以我基本上實現了一個refTree - 類,也只需要指針(_cell *)作爲輸入。

template <typename T> 
class refTree 
{ 
public: 
    void add (T *o)  { _ref<T> r = o; _m_children.push_back (r); } 
    void remove (T *o)  { ... } 

    list<_ref<T> > _m_children; 
}; 

此外,這仍然工作正常。使用

class _cell : public refTree<_cell> 
{ 
    : 
}; 

到用戶代碼中沒有變化,但所有補充_cell *它們添加到樹前,現在引用。

好,但現在我想能夠在_cell級別上選擇使用哪種樹模板實現。所以這意味着我必須使_cell - 類成爲一個模板類,它將模板類作爲參數(所選樹模板)。

template <template <typename> class __TyTree = tree> 
class Cell : public __TyTree <Cell>  // cannot work - no question, Cell expects input 
{ 
}; 

在這裏,我們得到了遞歸問題 - ofcourse編譯器不能夠解決,因爲小區正在等待一棵樹 - 這是期待一個簡單類型的參數(這應該是一個細胞OFC參數正在等待一個樹 - 參數期望一個簡單的....)。

你得到的圖片 - 什麼是這種問題的適當解決方案?

回答

5

沒有遞歸。 Cell的模板參數是__TyTree,而不是__TyTree<Cell>

template <template <typename> class __TyTree = tree> 
class Cell : public __TyTree <Cell<__TyTree> > 
{ 
}; 

int main() 
{ 
    Cell   mycell0; // error 
    Cell<>  mycell1; // ok. tree is used 
    Cell<tree> mycell2; 
    Cell<refTree> mycell3; 
} 

P.S.您不應該在__TyTree中使用兩個前導下劃線,因爲它是爲C++標準的實現目的而保留的。

+0

請檢查。我認爲一切都很好。 – 2009-10-27 14:22:33

+0

Aaah是的,你是對的,它現在編譯好了。與雙重下劃線的預感相吻合 - 會避免這種情況。有一件事仍令我感到困惑 - 默認參數在這裏不被接受 - 似乎我必須宣佈Cell mycell;我不能只聲明Cell mycell; - 有任何想法嗎 ? – 2009-10-27 14:36:01

+1

如果你想省略默認參數,你應該寫'Cell <>'。因爲'Cell'是模板類。 – 2009-10-27 14:39:13

2

您有兩個單獨的問題:單元格中的內容以及單元格如何相互連接。您需要爲此使用兩個單獨的數據結構。換句話說,正確的斷裂環節是樹的細胞遺傳。您節省的少量內存是不值得的 - 放棄「侵入式」的方法。細胞不應該意識到樹保持它的方式。

+0

嗯,我越想它更多我喜歡它。但需要很多反思。 – 2009-10-27 14:56:21

+0

感謝您的幫助,經過幾個小時試圖評估不同方法的圈子後,我想我終於找到了一個解決方案 - 一個節點系統。因此,每個節點都可以連接到其他節點並公開getNext,getPrev,getFirstChild,getParent等...並且細胞從節點派生出來,因此它可以直接訪問子節點和父節點 - 這也意味着我不必爲我想,這總是一件好事。 – 2009-10-28 07:43:13