2011-11-05 4 views
0

Je donne les résultats suivants dans une 3ème tête de base du parti, que je préférerais ne pas toucher:usine - avec des modèles

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); 
    } 
}; 

et souhaite ajouter une sous-classe de TypedNode à l'arbre avec d'autres méthodes et membres. Existe-t-il une manière propre de faire ceci sans refactoriser le code original? Je pense que le noeud du problème est: TypedNode * ret = new TypedNode (this); Cela ressemble à ce qu'il pourrait utiliser une usine, peut-être en spécialisant l'instanciation de modèle TypedNode et en incluant l'en-tête avant les en-têtes de base. Quelque chose comme:

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

Mais il échoue à se plaindre "too few template-parameter-lists". Probablement quelque chose de trivial, mais mon modèle-fu < > est un peu rouillé.!> (Toutes les idées seraient appréciées

Répondre

0

Les deux Tree et TypedNode sont des modèles, votre spécialisation devrait être:

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

One More Time. ..!. la zone d'édition a expiré insiste sur la présentation du commentaire dans ce navigateur Merci - qui a réussi à avoir autour de l'erreur est regrettable autre rapidement surgi se plaindre: courant = courant-> modèle newChild (pos) indiquant qu'il ne peut pas convertir l'arbre :: TypedNode * en Tree :: AbstractNode * dans l'affectation. TypedNode est une sous-classe de AbstractNode, mais peut-être parce que la première déclaration de TypedNode ne spécifie pas qu'elle hérite de AbstractNode. – user1031420

+0

Nevermind .. il existe une approche alternative qui évite tout ce template-fu. Même si je l'ai fait fonctionner je pense que le déplacer vers un autre compilateur pourrait être une aventure et le problème est assez trivial. Merci de votre aide! – user1031420