Doch zu const-correct?
-
Him ich hab folgendes kleines Problem mit der etwas uebergenauen Handhabung von const Datenmembern seitens eines Compilers:
struct PytParam { typedef const int Par; Par PARP90, PARP85, PARP86; Par PARP81min, PARP81max; //PTMin for secondary scatters Par PARP89, CKIN3; //same for all sets Par pytVers; }; const PytParam pytParam[n]= { { 16, 33, 66, 19, 19, 1000, 20, PYTHIA62 }, { 16, 33, 66, 19, 19, 1000, 20, PYTHIA62 }, //... }Da meckert er:
: In member function ` PytParam& PytParam::operator=(const PytParam&)': : error: non-static const member `const int PytParam::PARP90', can't use default assignment operatorUnd so weiter fuer alle member von PytParam
Wie kann ich das umgehen? Ich benutze sie ja wirklich als const structs, nur scheint er das bei der initialisierung anders zu sehen...
-
Hallo,
Du kannst nunmal einer konstanten struct mit konstanten Membern nichts zuweisen. Bastel dir doch einen Konstruktor für deine struct der die Parameter übernehmen kann und fülle dann einen vector mit derartig konstruierten Objekten.
-
Kommen Konstruktor und Init-Liste in Frage?
struct PytParam { typedef const int Par; Par PARP90, PARP85, PARP86; // gekürzt PytParam(Par a, Par b, Par c /*, ...*/): PARP90( a ), PARP85( b ), PARP86( c ) {} }; const PytParam pytParam[]= { PytParam( 16, 33, 66 /*, ...*/ ), PytParam( 16, 33, 66 /*, ...*/ ) };EDIT:
Hmmm, too slow
-
Meinen Infos zufolge ist die Initialisierung fuer const structs sofort nach Deklaration nur per Gleichheitszeichen moeglich, und zwar ohne Konstruktor (wie waere es denn sonst in C auch moeglich...)
Um Missverstaendnissen vorzubeugen: nein, ich mache kein C, sondern zwar C++, allerdings kann ich auf die Loesung mit dem vector nicht zurueckgreifen, weil STL-Container bei meinem "Compiler" (der eher ein interpreter ist) fehlerhaft implementiert sind. Und nein, ich kann nicht auf einen anderen Compiler wechseln./edit: auf LJ's Art versuch ichs mal, danke.
//eedit: bringt mir immernoch die gleiche Fehlermeldung
-
pumuckl schrieb:
//eedit: bringt mir immernoch die gleiche Fehlermeldung

? Zeig mal bitte nochmal dann den Code, sollte/müsste eigentlich so funktionieren.
-
struct PytParam { typedef const int Par; Par PARP90, PARP85, PARP86; Par PARP81min, PARP81max; //PTMin for secondary scatters Par PARP89, CKIN3; //same for all sets Par pytVers; PytParam(Par p90, Par p85, Par p86, Par p81mn, Par p81mx, Par p89, Par ck3, Par pv) : PARP90(p90), PARP85(p85), PARP86(p86), PARP81min(p81mn), PARP81max(p81mx), PARP89(p89), CKIN3(ck3), pytVers(pv) {} }; const PytParam pytParam[nPytSets]= { // P90, P85, \P86, 81<, 81>, P89, CK3, PVers // ============================================= // PYTHIA 6.2, parameters used earlier PytParam( 16, 33, 66, 19, 19, 1000, 20, PYTHIA62 ), //P62_DIRECT PytParam( 16, 33, 66, 19, 19, 1000, 20, PYTHIA62 ), //P62_NOMPI PytParam( 0, 33, 66, 11, 19, 1000, 20, PYTHIA62 ), //P62_s000_033_066 PytParam( 0, 90, 95, 9, 19, 1000, 20, PYTHIA62 ), //P62_s000_090_095 PytParam( 13, 33, 66, 11, 23, 1000, 20, PYTHIA62 ), //P62_s013_033_066 //... };So wies vorgeschlagen wurde.
-
Was ist nPytSets ? Höchswahrscheinlich nix constes ...
-
natuerlich was konstantes, sonst waere allerdings auch die Fehlermeldung eine voellig andere:
const int nPytSets = 19;
-
pumuckl schrieb:
Wie kann ich das umgehen? Ich benutze sie ja wirklich als const structs, nur scheint er das bei der initialisierung anders zu sehen...
Wenn die Strukturen immer konstant sind, mach sie const; wenn Member konstant sein sollen, unabhängig davon, ab die Strukturen konstant sind oder nicht, dann mach die Member konstant. Mach die Member aber nicht const, wenn sie nur deshalb konstant auftreten, weil die Strukturen immer konstant sind. Das macht unnötigen Ärger, hilft nicht und ist auch logisch zweifelhaft.
-
danke, das hat geholfen. Ich benutze ausschliesslich das array von konstanten
PytParams, da ists natuerlich unnoetig die member nochmal const zu machen. typedef geaendert=>funktioniert.