2011-11-05 57 views
0

我見的第三方核心頭下面,我寧願不碰:工廠模式 - 使用模板

template<typename Iterator_T> 
struct Tree 
{ 
    template<typename Node_T> 
    struct TypedNode; 

    struct AbstractNode 
    { 
     AbstractNode(Iterator_T t) 
     { 
      ... 
     } 

     template<typename Rule_T> 
     TypedNode<Rule_T>* NewChild() 
     { 
      TypedNode<Rule_T>* ret = new TypedNode<Rule_T>(this); 
      AddChild(ret); 
      return ret; 
     } 

     template<typename T> 
     TypedNode<T>* GetFirstTypedChild(); 
    }; 

    template<typename Node_T> 
    struct TypedNode : AbstractNode 
    { 
     ... 
    }; 

    template<typename Rule_T, typename ParserState_T> 
    void CreateNode(ParserState_T& p) 
    { 
     current = current->template NewChild<Rule_T>(); 
    } 
}; 

template<typename Node_T> 
struct TreeBuilder 
{ 
    Tree<Iterator_T> tree; 

    template<typename Rule_T> 
    void CreateNode() 
    { 
     tree.CreateNode<Rule_T>(*this); 
    } 
}; 

,並想TypedNode的子類樹添加額外的方法和成員。有沒有一個乾淨的方式來做到這一點,而不重構原代碼?我認爲問題的癥結在於: TypedNode * ret = new TypedNode(this);

這看起來好像可以使用Factory,也許是通過專門化TypedNode模板實例並在基頭之前包含頭部。例如:

template<> 
struct Tree<const char*>::TypedNode<SpecificRuleType> 
{ 
    ... 
}; 

但它沒有抱怨「太少的模板參數列表」。可能是一些小事,但我<模板福>是有點生疏了。!>(任何想法,將不勝感激

回答

0

兩個TreeTypedNode是模板,您的專業應該是:

template<> // for Tree<...> 
template<> // for TypedNode<...> 
struct Tree<const char*>::TypedNode<SpecificRuleType> 
{ 
    ... 
}; 
+0

一次。 。!。在編輯框中超時堅持在這個瀏覽器提交評論 感謝 - 這並避開錯誤令人遺憾的是另一個及時彈出抱怨: 電流=電流 - >模板newChild對象(POS) 表示它不能將Tree :: TypedNode *轉換爲樹中的 :: AbstractNode *。 TypedNode是AbstractNode的子類,但也許這是因爲TypedNode的第一個聲明沒有指定它從AbstractNode繼承。 – user1031420

+0

沒關係..有一種避免所有這個模板-fu的替代方法。即使我確實得到它的工作,我懷疑移動到另一個編譯器可能是一個冒險,這個問題是相當微不足道的。謝謝你的幫助! – user1031420