static member attributes
-
Hallo an alle
ich habe hier folgendes problem:
mein header sieht folgendermaßen aus// filename test.h #include <map> #include <string> #include <windows.h> class Test { ... public: static std::map<BYTE, string> myMap; ... };
Es folg der cpp file:
// filename test.cpp #include "test.h" ... std::map<BYTE, string> Test::myMap; Test::myMap[0x01] = "test"; // hier kriege ich den Compiler error C2501 unter VS .NET 2003 ...
kann mir vielleicht jemand helfen das dillema zu umgehen?
Die Fehlermeldung selbst lautet folgendermaßen:Test.cpp(15): error C2501: 'Test::myMap' : missing storage-class or type specifiers Test.cpp(15): error C2040: 'myMap' : 'int [1]' differs in levels of indirection from 'std::map<_Kty,_Ty>' with [ _Kty=BYTE, _Ty=string ]
Ich danke euch in Voraus
-
mit dem gcc unter linux kriege ich von Bedeutung her die selbe Fehlermeldung
-
Wo steht denn diese Zeile
Test::myMap[0x01] = "test"; // hier kriege ich den Compiler error C2501 unter VS .NET 2003
?
Hört sich an als hättest du sie "global" irgendwo stehen..Mach doch mal sowas:
namespace { map<BYTE, string> initMap() { map<BYTE, string> res; res[0x01] = "hello"; res[0x02] = "world"; // ... return res; } } std::map<BYTE, string> Test::myMap = initMap();
-
es liegt schon in einem eigenem namespace.
Das Problem ist, dass ich auf die inhalte der map vor dem Erzeugen eines Objektes von der Klasse Test zugreifen muss.Ich habe in der Klasse eine string member variable, der bei der erzeugung des Objektes dann der Wert aus der map in abhängigkeit von dem gegebenen BYTE zugewiesen wird.
Das Objekt muss also so erzeugt werden:
BYTE b = getByte(); // zumindes auf diese art und weise Test t(myMap[b]); ...
die jeweiligen BYTEs, die für mich relevant sind ligen in dem kompletten Intervall, von 0x01 bis 0xff und für jeden von diesen gibt es einen speziellen string wert in der map
-
class Test { public: static std::map<int, string> myMap; }; // Hier ist die Definition. std::map<BYTE, string> Test::myMap; int main() { Test::myMap[0x01] = "test"; }
so gehts bei mir, ob dir das so gefällt is ne andere sache;-)
cu
-
hhm
das ist ja das Problem, das es quasi wie eine statische konstante definiert werden soll. Egal wo ich mich in dem Code befinde will, bzw. muss ich auf die inhalte der map zugreifen un diese sollen schon vorhanden sein, ohne, dass zuvor irgendwelche methode aufgerufen worden ist
-
dadrus schrieb:
es liegt schon in einem eigenem namespace.
Geht nicht um den namespace, das ist nur ein "static-Ersatz" - geht um die Funktion
-
sorry hab das irgendwie anders verstanden.
Das funktioniert ganz gut.Da ich aber 254 einträge in der map halten muss habe ich eine zusatz frage:
gibt es bei solcher lösung nicht viel zu viel copy - overhead?namespace { map<BYTE, string> initMap() { map<BYTE, string> res; res[0x01] = "hello"; res[0x02] = "world"; // ... return res; } } std::map<BYTE, string> Test::myMap = initMap();
Wenn ja, wie könnte man es vermeiden mit dem hintergedanken, dass die map static sein soll; kann auch ruhig static const sein.