2 Stimmen

Das Deklarieren eines std::map-Iterators verursacht einen seltsamen Fehler

Ich versuche gerade, eine Karte Iterator zu deklarieren, aber ich erhalte einen Kompilierungsfehler sagen "erwartet ; vor es"

Ich glaube, es ist, weil ich nicht den gesamten std-Namespace (mit Namespace std;) enthalten haben, aber ich absichtlich nicht wollen, um alle es zu enthalten.

Mein Code:

#include <map>
#include <string>

template <class Object>
class Cont
{
    public:
       Cont() {}
       Object* get( unsigned int nID )
       {
           std::map <unsigned int, Object*>::iterator it = m.begin(); // error here "expected ; before it" what is this error?

           for ( ; it != m.end(); it++ ) 
           {
               if ( (*it).second->ID == nID ) { return (*it).second; }
           }

           return NULL;
       }

       std::map <unsigned int, Object*> m;
};

Ich habe das auch schon versucht, aber es funktioniert nicht:

std::map <unsigned int, Object*>::std::iterator it = m.begin();

12voto

GWW Punkte 41151

Wenn ich mich nicht irre, weil Sie ein Template-Argument verwenden, müssen Sie die Iterator-Deklaration mit vorangestellt typename .

typename std::map <unsigned int, Object*>::iterator it = m.begin();

1voto

holtavolt Punkte 4277

Wie sind Ihre Compiler- und Flag-Einstellungen? Ich konnte dies OK zu bauen.

// test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <map>
#include <string>

class Foo
{
public:
    int ID;
};

template <class Object> class Cont
{
    public:
       Cont() {}
       Object* get( unsigned int nID )
       {
           std::map <unsigned int, Object*>::iterator it = m.begin(); // error here "expected ; before it" what is this error?

           for ( ; it != m.end(); it++ ) 
           {
               if ( (*it).second->ID == nID ) { return (*it).second; }
           }

           return NULL;
       }

       std::map <unsigned int, Object*> m;
};

int _tmain(int argc, _TCHAR* argv[])
{
    Cont<Foo> c;
    c.get( 2 );
    return 0;
}

0voto

jwismar Punkte 12035

Sie sagen nicht, welchen Compiler Sie verwenden, aber nur durch Ausschneiden und Einfügen dieser in eine neue Datei, kompiliert es gut in VS2010. Sie müssen nicht using namespace std; sicherlich....

(Und Ihr Kniff, ein weiteres std:: vor iterator zu setzen, war kreativ, ist aber nicht korrekt :-) Sie geben an, dass die Map-Klassenvorlage im Namespace std:: liegt, und iterator ist ein Typ, der in der Map-Vorlage verschachtelt ist).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X