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