2011-11-05 42 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