2016-08-10 9 views
-4

Der folgende Code führt zwei Compiler-Fehler in VS 2013:Syntaxfehler für Bezeichner 'Iterator'

  1. Die Vorlage Funktionsdefinition führt

    Fehler C2061: Syntaxfehler: Bezeichner 'iterator'

  2. Die Spezialisierung dieser Template-Funktion wirft

    erro r C2912: explizite Spezialisierung ‚double getFillIn<double,double>(fillInOptions,double,std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,inputLoader *,va_list)‘ ist keine Spezialisierung einer Funktion Vorlage

Kann jemand bitte erklären, warum? Ich bin ziemlich sicher, dass der zweite Fehler nur eine Konsequenz des ersten ist, aber ich verstehe nicht, warum es iterator Identifikator nicht herausfinden kann.

#include <map> 

template <typename T> class table { 
}; 

template <typename S, typename T> 
void f(S s, std::map<S, table<T>*>::iterator it); 
+2

Try 'Type-Name Karte *> :: iterator'. – songyuanyao

+0

Ich habe mich geirrt, aber 'Template-Klasse lookupTable ;' vor der vollständigen Definition 'lookupTable' wird dich beißen. Off topic: Die Standardfälle in den Schaltern geben nichts zurück. Gut für eine Compiler-Warnung und ein bisschen fieseres Debugging, wenn ein ungültiges oder neues 'opt' jemals hereinschlüpft. – user4581301

Antwort

1

Da der Compiler den Typ der std::map<S, table<T>*> noch nicht kennt, ist es noch nicht wissen kann, dass std::map<S, table<T>*>::iterator ein Typ ist (es könnte ein Mitglied sein). Sie müssen es sagen, dass es eine Art sein:

template <typename S, typename T> 
void f(S s, typename std::map<S, table<T>*>::iterator it); 
+0

Beide Fehler behoben - vielen Dank! – GodLovesUGaius

Verwandte Themen