У меня есть следующее в стороннем заголовочном ядре, которое я предпочел бы не трогать:
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>
{
...
};
Но он терпит неудачу, жалуясь на "слишком мало списков параметров шаблона".Наверное, что-то тривиально, но мойнемного ржавый:> (. Любые идеи будут оценены!