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>
{
...
};
但它没有抱怨“太少的模板参数列表”。可能是一些小事,但我<模板福>是有点生疏了。!>(任何想法,将不胜感激
一次。 。!。在编辑框中超时坚持在这个浏览器提交评论 感谢 - 这并避开错误令人遗憾的是另一个及时弹出抱怨: 电流=电流 - >模板newChild对象(POS) 表示它不能将Tree :: TypedNode *转换为树中的 :: AbstractNode *。 TypedNode是AbstractNode的子类,但也许这是因为TypedNode的第一个声明没有指定它从AbstractNode继承。 –
user1031420
没关系..有一种避免所有这个模板-fu的替代方法。即使我确实得到它的工作,我怀疑移动到另一个编译器可能是一个冒险,这个问题是相当微不足道的。谢谢你的帮助! – user1031420