2017-12-07 3 views
0

Wie kann ich einen Iterator für Template-Argument-Map deklarieren?C++ Iterator deklarieren aus typedef std :: map als Vorlage Argument

Ich weiß, ich könnte es als Argument aus der Hauptfunktion als ein weiteres Template-Argument übergeben, aber wenn ich nicht, wie kann ich es erklären?

template< typename container > 
int print_data(container map) 
{ 
    map::iterator iter; // this is wrong 
    return 0; 
} 

int main() 
{ 
    typedef std::map< int, double > Map; 
    Map new_map; 

    print_data<Map>(new_map); 
} 
+1

'typename container :: iterator' oder verwenden Sie den automatischen Typ deducation' auto iter {map.begin()}; ' – VTT

Antwort

2

Während

map::iterator iter; // this is wrong 

ist wahr. Das liegt nur daran, dass Sie den Scope-Auflösungsoperator für ein Objekt verwenden und nicht für einen Bereich, der einen Klassennamen oder einen Namespace angibt. Also das:

typename container::iterator iter; 

wäre korrekt. Beachten Sie, dass das Schlüsselwort typename wichtig und obligatorisch ist. Sie müssen dem Compiler mitteilen, dass dieser abhängige Name, auf den Sie zugreifen, ein Typ ist, sodass die Zeile als Deklaration analysiert wird.

0

Wenn Sie einen C++ 11 (oder späteren) Compiler verwenden können, haben Sie mehrere Möglichkeiten, iter zu deklarieren.

  1. Wenn Sie es in einer Anweisung deklarieren und initialisieren, können Sie verwenden:

    auto iter = map.begin(); 
    
  2. Sie auch decltype den Typ ableiten können.

    using iterator_type = decltype(map.begin()); 
    iterator_type iter; 
    

würde ich empfehlen, die erste Methode. Es ist weniger Code zu verarbeiten. Es ist auch eine bessere Programmiergewohnheit, eine Variable in einer Anweisung zu deklarieren und zu initialisieren.

0
typename Container::iterator iter = ...; 

Der Compiler sieht Vorlagenelemente standardmäßig als Variablen, wenn es sich um einen Typ handelt, den Sie mit "typename" angeben müssen.