2016-08-01 6 views
1

Der C2440-Fehler (aus 'char' auf 'Text_iterator' nicht konvertieren, um auf dieser Linie auftritt):Bereich for-Schleife erkennt falschen Typen (C2440)

void print(Document& d) 
{ 
    for (Text_iterator p : d) cout << *p; 
} 

Ersetzen 'Text_iterator' mit 'auto' gibt der 'illegale indirekte Fehler' (dereferenzierter Typ muss ein Zeiger sein).

Das Klassendokument hat die Funktionen begin() und end() definiert (wobei Text_iterator zurückgegeben wird), und Text_iterator verfügt über die üblichen Iteratoroperatoren. Hier ist der Code:

class Text_iterator 
{ 
    list<Line>::iterator ln; 
    Line::iterator pos; 
public: 
    // . . . 

    char& operator*() { return *pos; } 
    Text_iterator& operator++(); 

    // . . . 
}; 

Und Dokument:

struct Document 
{ 
    list<Line> line; 

    Text_iterator begin() 
    { 
     // . . . 
    } 

    Text_iterator end() 
    { 
     // . . . 
    } 

    // . . . 
}; 

Antwort

4

Sie benutzen einen falschen Typ für die Loop-Variable. Die Variable ist nicht der Iterator des Containers, aber darauf verweist der Iterator des Containers.

Wenn Sie

hatte
std::vector<int> foo(10); 

Und Sie wollen for-Schleife eine reichten verwenden basierend würden Sie

for (int e : foo) // or for (auto e : foo) 
    std::cout << e << " "; 

Sie nicht

for (std::vector<int>::iterator e : foo) 
    std::cout << *e << " "; 

verwenden würden, verwenden Sie müssen also verwenden was auch immer Text_iterator Punkte anstelle von Text_iterator. In diesem Fall

void print(Document& d) 
{ 
    // if p is cheap to copy 
    for (auto p : d) cout << p; 
    // if p is expensive to copy 
    for (const auto& p : d) cout << p; 
} 

sollte funktionieren.

+0

oder (besser IMHO) 'für (const Auto & p: d) cout <

+0

@JesperJuhl guter Punkt. Zur Antwort hinzugefügt – NathanOliver

3

Die range-for iteriert über den Inhalt eines Containers. Es geht also nicht um Iteratoren, sondern um dereferenzierte Iteratoren.

sollte Ihr Code sein:

void print(Document& d) 
{ 
    for (auto c : d) cout << c; 
} 

oder wenn Sie wirklich die Kontrolle behalten über die Iteratoren wollen:

void print(Document& d) 
{ 
    for (auto p = d.begin(); p!=d.end(); p++) cout << *p; 
} 
+1

Und wenn 'p' von einem benutzerdefinierten Iterator-Typ ist, dann kann' ++ p' vorzuziehen sein (in jedem Fall eine gute Standardgewohnheit). –

Verwandte Themen