Problem mit einer Liste, bzw. typedef

LL0rd

Erfahrenes Mitglied
Hallo Leute,

ich habe gerade ein Problem mit VS C++. Ich möchte eine Liste anlegen, die z.B. int Zahlen speichert. Ich habe deshalb in der header Datei meiner Klasse folgendes geschrieben:

Code:
typedef std::list<std::int> L;

Doch leider haut mir der compiler gleich ein dutzend Fehler raus:

Code:
 'list' : is not a member of 'std'	
missing ';' before '<'
missing type specifier - int assumed. Note: C++ does not support default-int	
'int' : illegal token on right side of '::'

Kann mir von euch jemand einen Tipp geben, denn momentan stehe ich auf dem Trockenen. Wenn ich die Definition anstatt in die Header Datei in meine Main cpp schreibe, funktioniert die Liste.
 
C++:
#include <list>
typedef std::list<int> L;

Es fehlt das Include, daher ist "list" nicht bekannt. Eine Klasse oder ein Datentyp "int" gibt es im std-Namensraum nicht.

Gruß
MCoder
 
Hi,

ich muss jetzt nochmal kurz zurückfragen. Bei mir stand das include in der "main" Datei. Dann habe ich noch eine Klasse bestehend aus test.h und test.cpp. In der test.h war der Listenaufruf. Als ich den Listenaufruf in die test.cpp verschoben habe, hat alles funktioniert. Wieso musste ich jetzt #include <list> direkt in die Header Datei schreiben?
 
Hi.
Hi,

ich muss jetzt nochmal kurz zurückfragen. Bei mir stand das include in der "main" Datei. Dann habe ich noch eine Klasse bestehend aus test.h und test.cpp. In der test.h war der Listenaufruf. Als ich den Listenaufruf in die test.cpp verschoben habe, hat alles funktioniert. Wieso musste ich jetzt #include <list> direkt in die Header Datei schreiben?
Da wo du es benutzt, mußt du es auch einbinden. Woher sollte der Compiler die Deklaration sonst kennen?

Gruß
 
Ich glaube, dass mein Verständnis des Include Befehls nicht ganz richtig ist. Für mich bedeutet include einfach nur, dass der Quelltext der entsprechenden Datei direkt in den eigenen Quelltext reingeschrieben wird.

Deshalb bin ich auch davon ausgegangen, dass es reicht, wenn ich alle includes an einer stelle habe.
 
Ich glaube, dass mein Verständnis des Include Befehls nicht ganz richtig ist. Für mich bedeutet include einfach nur, dass der Quelltext der entsprechenden Datei direkt in den eigenen Quelltext reingeschrieben wird.
Das ist so auch richtig.
Deshalb bin ich auch davon ausgegangen, dass es reicht, wenn ich alle includes an einer stelle habe.
Nein, du mußt sicherstellen, das die entsprechende Headerdatei vor der Verwendung der in dieser Headerdatei deklarierten Typen eingebunden wird.

Das kannst du am einfachsten sicherstellen, wenn du die Headerdatei direkt in der Datei in der du die deklarierten Typen benutzt auch einbindest.

Es würde natürlich auch funktionieren, wenn du in der .cpp Datei zuerst die <list> Headerdatei und danach deine Headerdatei einbindest. Es ist allerdings unsinnig eine solche Anforderung an den Benutzer der Headerdatei zu stellen, das er dran denken muß, vor dem Einbinden der Headerdatei den <list> Header einzubinden.

Gruß
 
Zuletzt bearbeitet:
Es würde natürlich auch funktionieren, wenn du in der .cpp Datei zuerst die <list> Headerdatei und danach deine Headerdatei einbindest. Es ist allerdings unsinnig eine solche Anforderung an den Benutzer der Headerdatei zu stellen, das er dran denken muß, vor dem Einbinden der Headerdatei den <list> Header einzubinden.

Genau das habe ich getan, doch es hat nicht funktioniert.

Aber ich habe momentan noch ein anderes Problem. Ich komme ursprünglich aus der C Welt, OOP mit C++ habe ich (bis auf irgendwelche dummen Testaufgaben damals in der Uni) kaum programmiert. Die letzten 4 Jahre habe ich eigentlich "nur" mit C# und Java etwas gemacht.

Ich habe jetzt folgendes vor: Ich habe eine Klasse. Alle Instanzen dieser Klasse sollen in einem statischen Attribut der gleichen Klasse stehen. In dem Header habe ich deshalb momentan folgendes stehen:

Code:
    typedef std::vector<MyClass*> MyClassList;
    static MyClassList list;

und in der cpp Datei zu der Klasse im Constructor folgendes:

Code:
MyClass::list.push_back(this);

Also sobald eine neue Instanz erstellt wird, soll sie in die Liste eingefügt werden. Doch es geht leider nicht:
Code:
Error	1	error LNK2001: unresolved external symbol "public: static class std::vector<class IP_v4 *,class std::allocator<class IP_v4 *> > IP_v4::list" (?list@IP_v4@@2V?$vector@PAVIP_v4@@V?$allocator@PAVIP_v4@@@std@@@std@@A)	IP_v4.obj	CPP-Test1

Momentan bin ich nicht mehr sicher, ob die liste oder der vector überhaupt die richtige (dynamische) Datenstruktur für mich ist.
 
Genau das habe ich getan, doch es hat nicht funktioniert.
Da hast du vermutlich einen anderen Fehler gemacht.
Also sobald eine neue Instanz erstellt wird, soll sie in die Liste eingefügt werden. Doch es geht leider nicht:
Code:
Error	1	error LNK2001: unresolved external symbol "public: static class std::vector<class IP_v4 *,class std::allocator<class IP_v4 *> > IP_v4::list" (?list@IP_v4@@2V?$vector@PAVIP_v4@@V?$allocator@PAVIP_v4@@@std@@@std@@A)	IP_v4.obj	CPP-Test1
Naja, bisher hast du die Klassenvariable auch lediglich deklariert und noch nicht definiert:
C++:
// MyClass.cpp

MyClass::MyClassList MyClass::list;
Momentan bin ich nicht mehr sicher, ob die liste oder der vector überhaupt die richtige (dynamische) Datenstruktur für mich ist.
Das kannst du ja später recht einfach anpassen.

Gruß
 
Zurück