warum ist das keine konstante?
- 
					
					
					
					
 Folgendes Szenario: 
 Ich möchte so ne Art switches in meine Klasse einbauen ähnlich ios::boolalpha und ähnliche Manipulatoren.args.hpp: class Args { public: typedef unsigned int argtype; static const argtype nextarg; static const argtype eqsign; static const argtype noarg; static const argtype nousedmark; //... template<class T> T get_option(const char* name, argtype at = eqsign); //... }; template<class T> T Args::get_option(const char* name, argtype at) { //... switch (at & 3) { case eqsign: //0 //... break; case noarg: //2 //... break; case nextarg: //1 //... break; default: //3 break; } //... }Die Intitialisierung/Definition der static const's steht in der args.cpp 
 wenn ich jetzt die args.o compiliere, läuft alles wie gewohnt, wenn ich aber die args.hpp woanders einbinde meckert er beim compilieren was von "error: case label does not reduce to an integer constant"
 Wie kann ich das richtig hinbekommen? Muss ich etwa die Definition der Konstanten auch in die hpp schreiben? (gefällt mir wegen der kapselung nicht)
 
- 
					
					
					
					
 Wenn ich das hier im Forum richtig gelernt habe, dann müsste stehen in arg.hpp: 
 [cpp]class Args{static int eqsign; 
 static int noargn;
 //...
 {/cpp]und in der cpp [cpp] 
 int Args::eqsign = 0;
 int Args::noargn = 1;
 // ....
 /cpp]ich würde das mit Enum machen wollen ? 
 
- 
					
					
					
					
 pumuckl schrieb: ... 
 Die Intitialisierung/Definition der static const's steht in der args.cpp
 wenn ich jetzt die args.o compiliere, läuft alles wie gewohnt, wenn ich aber die args.hpp woanders einbinde meckert er beim compilieren was von "error: case label does not reduce to an integer constant"Wenn du die Header in ein anderes Projekt einbindest, musst du natuerlich auch die 
 korrespondierende .cpp-Datei dem Projekt hinzufuegen, sonst kann der Compiler die
 Definition der Variablen nicht finden.Wie kann ich das richtig hinbekommen? Muss ich etwa die Definition der Konstanten auch in die hpp schreiben? (gefällt mir wegen der kapselung nicht) Nein das musst du natuerlich nicht. Du machst das dann so, wie HannsW das bereits 
 gepostet hat. Aber ueberlege dir ruhig, ob du, wie von HannsW schon angesprochen, hier
 nicht ein enum verwenden willst.mfg 
 v R
 
- 
					
					
					
					
 statische integrale konstanten kannst du direkt in der klassendefinition definieren und initialisieren: class Args { public: typedef unsigned int argtype; static const argtype nextarg = 0; static const argtype eqsign = 1; static const argtype noarg = 2; static const argtype nousedmark = 3; //... };enums kann man ebenfalls verwenden; das ist aber nicht immer die beste wahl. 
 
- 
					
					
					
					
 virtuell Realisticer schrieb: Wenn du die Header in ein anderes Projekt einbindest, musst du natuerlich auch die 
 korrespondierende .cpp-Datei dem Projekt hinzufuegen, sonst kann der Compiler die
 Definition der Variablen nicht finden.Das ist mir klar, nur kann ich die Objektdateien des Projektes nichtmal compilieren, da er eben oben genannte Fehlermeldung auswirft. Und so wie HannsW es geschrieben hat mache ichs ja auch (mal abgesehen davon, dass sie nciht nur static sondern auch const sind), und gerade das funktioniert ja nicht... 
 
- 
					
					
					
					
 case-Labels müssen Compilezeit-Konstanten sein. Das heißt, deine Konstanten musst du in der Klasse selbst definieren, entweder so wie camper gesagt hat, oder per enum (enum funktioniert auch bei älteren Compilern).