2010-11-22 2 views
0
// Standard Template Library example 
#include <iostream> 
#include <list> 
using namespace std; 
// Simple example uses type int 
main() 
{ 
    list<int> L; 
    L.push_back(0);    // Insert a new element at the end 
    L.push_front(0);    // Insert a new element at the beginning 
    L.insert(++L.begin(),2);  // Insert "</span><span title="Convert this amount" class="currency_converter_link">2</span><span class="currency_converter_text">" before position of first argument 
           // (Place before second argument) 
    L.push_back(5); 
    L.push_back(6); 

    static list<int>::iterator itr = 0 ; 

    if(itr == L.end()) 
    { 
     cout <<"itr is equal to NULL;)" ; 
    } 
    else 
    { 
     cout <<"Not NULL "; 
    } 


    for(itr=L.begin(); itr != L.end(); ++itr) 
     cout << *itr << " "; 

    cout << endl; 
    return 0; 
} 

ich über Code haben, die sehr einfach ist, und einen einfachen Fehler zu werfen.Coding bricht, wenn der Port von GCC 3.1.2 bis 4.2.2

iterator.cpp:16:29: error: conversion from 'int' to non-scalar type 'std::list<i 
nt>::iterator' requested 

Ich bin ganz neu in C++, was beste Weg ist, mit diesem Fehler zu behandeln, so dass Code gut übersetzbar. Nur zur Information, seine Portierungsproblem, wenn Sie den gleichen Code von GCC 3.1.2 zu 4.2.2 wechseln. grundsätzlich ganze Frage wird um eine Zeile gestrickt, die

static list<int>::iterator itr = 0 ; 

wie wenn mir jemand gutes Dokument führen über diese Iteratoren zu lesen. Als der alte GCC diese Dinge akzeptierte oder nur warnend warnen, aber jetzt überlegen sie dies und den Fehler. Ich bin neugierig, dass, wenn wir NULL Zeiger zuordnen und gegen NULL vergleichen, was äquivalent ist, wenn es zum Iterator kommt.

Bitte helfen. Danke ...

+0

ich höre das ‚Brechen‘ klingen – Chubsdad

+4

Weggehen Warnungen in Ihrem Code ist ein gutes Zeichen, dass etwas nicht stimmt. Jede Warnung bedeutet, dass der Code wahrscheinlich nicht tragbar ist. Eine Warnung ist normalerweise ein logischer Fehler (auch wenn es kein syntaktischer/semantischer Fehler ist) und Sie sollten alle Warnungen als Fehler behandeln (und die Warnstufe so hoch wie möglich einstellen). –

+0

Warum sollte ein Iterator das sein? sei NULL ??? Es ist ein Iterator kein Zeiger (obwohl darunter ein Zeiger sein kann, ist dies ein Implementierungsdetail, auf das Sie sich definitiv nicht verlassen sollten). –

Antwort

1

Entfernen Sie einfach die explizite Initialisierung (plus, entfernen Sie die folgenden if - else).

Die Initialisierung = 0 kann funktionieren, wenn ein Iterator tatsächlich ein Zeiger ist, weil eine Kompilierzeitkonstante Integer 0 dann als Nullpointer-Konstante behandelt wird.

Wenn der Iterator nicht vom Zeigertyp ist, muss er diese Art der Initialisierung nicht unterstützen.

Prost & hth,

+0

Aber es ist ein Iterator. Die Implementierungsdetails eines Iterators sollten nicht berücksichtigt werden (sonst brechen Sie das Kapselungsprinzip). –

+0

@Martin: Ein Iterator ist ein Iterator, ja, und man sollte sich im Allgemeinen nicht auf Implementierungsdetails verlassen. Der erste ist eine bedeutungslose Tautologie (hast du den FB Tautology Club erwogen?), Und der zweite ist eine sinnlose Verallgemeinerung dessen, was ich geschrieben habe. Kurz gesagt, was Sie schreiben, ist technisch bedeutungsloser Hokuspokus, aber zu einem nicht-technischen Leser vermittelt den * Eindruck *, etwas hervorzuheben. –

+0

@Martin: bis zu deiner Schlussfolgerung du bist auf meine Antwort erarbeiten. Zum Beispiel, wo ich schreibe "hat keine Anforderung zu unterstützen", schreiben Sie "hat keine Anforderung EVER". Dann meinst du *, dass ich etwas anderes geschrieben habe. Hör auf zu lügen. Warum lügst du? –

2

wie folgt ändern:.

static list<int>::iterator itr = 0 ; 

zu

static list<int>::iterator itr = L.begin() ; 

BTW, warum wird dies als statische lokale Variable deklariert?

+0

+1 für das * warum ist es statisch * Bemerkung. Ich habe mich dasselbe gefragt. –

+0

-1 Der Iterator muss nicht explizit initialisiert werden (in diesem Code). Es ist wieder in der Schleife initialisiert. Am besten * entferne * die explizite Initialisierung (und nachfolgende 'if' Prüfung ihres Effekts), wie ich in meiner Antwort geschrieben habe. –

+0

Es sollte zeigen, wie es zu einem vernünftigen Standard initialisiert wird, der wahrscheinlich der Anfang der Liste ist (im Gegensatz zur Verwendung des Standardkonstruktors von list :: iterator) – Chubsdad

0

Zum einen der Fehler:

iterator.cpp:16:29: error: conversion from 'int' 
    to non-scalar type 'std::list<i nt>::iterator' requested 

Sie dies sehen, weil Sie versuchen, eine iterator zu einem int in dieser Zeile zu initialisieren:

static list<int>::iterator itr = 0 ; 

Der Compiler nicht kennt Wie konvertiert man eine int in eine iterator - daher der Fehler. Nicht wirklich sicher, warum Sie die iterator als static deklariert haben - sehe ich keinen Grund, dies zu tun. (. Das ist keine Ursache für den Fehler, aber es macht keinen Sinn, hier)

Umzug auf, dieser Code:

if(itr == L.end()) 
{ 
    cout <<"itr is equal to NULL;)" ; 
} 
else 
{ 
    cout <<"Not NULL "; 
} 

... nicht viel Zweck dienen, soweit es mich betrifft, . Sie haben gerade Ihren iterator mit einem 0 initialisiert, also warum testen Sie dann seinen Wert?

ich empfehlen, sich von der if-else Anweisung befreien, und Initialisieren der Iterator im Rahmen der for Schleife stattdessen wie folgt aus:

int main() 
{ 
    list<int> L; 
    L.push_back(0);    
    L.push_front(0);    
    L.insert(++L.begin(),2);  

    L.push_back(5); 
    L.push_back(6); 

    for(list<int>::iterator itr = L.begin(); itr != L.end(); ++itr) 
     cout << *itr << " "; 

    cout << endl; 
    return 0; 
}