2010-04-08 5 views
1

Il est tard et je n'arrive pas à comprendre ce qui ne va pas avec ma syntaxe. J'ai demandé à d'autres personnes et ils ne peuvent pas trouver l'erreur de syntaxe non plus alors je suis venu ici sur le conseil d'un ami.Problème de syntaxe C++

template <typename TT> 
bool PuzzleSolver<TT>::solve (const Clock &pz) { 

    possibConfigs_.push(pz.getInitial()); 
    vector< Configuration<TT> > next_; 

    //error is on next line 
    map< Configuration<TT> ,Configuration<TT> >::iterator found; 

    while (!possibConfigs_.empty() && possibConfigs_.front() != pz.getGoal()) { 
    Configuration<TT> cfg = possibConfigs_.front(); 
    possibConfigs_.pop(); 
    next_ = pz.getNext(cfg); 

    for (int i = 0; i < next_.size(); i++) { 
     found = seenConfigs_.find(next_[i]); 
     if (found != seenConfigs_.end()) { 
     possibConfigs_.push(next_[i]); 
     seenConfigs_.insert(make_pair(next_[i], cfg)); 
     } 
    } 
    } 
} 

Qu'est-ce qui ne va pas?

Merci pour toute aide.

+3

Obtenez-vous une erreur de compilation? C'est généralement une information utile pour commencer ... – KevenK

+2

Eh bien, quelle est votre erreur de compilation? – vladr

+1

Quel est le message d'erreur? –

Répondre

11

Si je me souviens bien, cette syntaxe est ambiguë:

map< Configuration<TT> ,Configuration<TT> >::iterator found; 

Essayez qu'au lieu:

typename map< Configuration<TT> ,Configuration<TT> >::iterator found; 
+0

Merci le correctif travaillé. – Doug

+2

http://pages.cs.wisc.edu/~driscoll/typename.html se référer à cela pour plus d'informations –

0

Pour les noms dépendants vous avez besoin d'utiliser le mot-clé typename . Un nom dépendant est un nom qui dépend d'un paramètre de modèle.

Vous devez donc:

typename map< Configuration<TT> ,Configuration<TT> >::iterator found; 

Cela est nécessaire parce que le type de votre carte ne sait pas jusqu'à ce que votre classe (Puzzle Solver) est instancié, car il dépend du paramètre du modèle TT.

0

Ceci est un exemple classique de l'utilisation obligatoire de typename pour identifier les types nommés qui dépendent du paramètre de type de modèle. Vous voulez utiliser

typename map< Configuration<TT>, Configuration<TT> >::iterator found; 

Fondamentalement, le compilateur ne peut pas savoir que map< Configuration<TT>, Configuration<TT> >::iterator est un type plutôt que, par exemple une variable membre, sauf si vous le dites. Chaque fois que vous utilisez un type nommé qui dépend du (des) paramètre (s) du template, vous devez utiliser typename (sauf dans quelques cas exceptionnels comme dans la liste d'initialisation d'un constructeur).