"static const int" geht aber "static const double" nicht



  • Ich habe folgende Header-Datei:
    Constants.h

    #ifndef CONSTANTS_H_
    #define CONSTANTS_H_
    
    class Constants {
    
    	public:
    	static const int numberOfStatisticObjects = 71; //71 Global + IPs
    
    	static const int numberOfPoissonAttributes = 10; //2;
    	static const int numberOfASNAttributes = 21; //3; //21 (20 + Rest)
    	static const int number30MinIntervals = 48; //3; //48
    	static const int numberOfDays = 7; //10; //7
    	static const int scaleFactor = 30; <----------- Ich beziehe mich hierauf
    	static const int number10SecIntervals = 180; //2; //180
    
    	static const int numberOfIterations = 1000; //2000
    	static const int numberSkipIterations = 990; //1000
    
    };
    
    #endif /* CONSTANTS_H_ */
    

    Dann in einer Klasse (die natürlich Constants einbindet) steht folgende Codezeile

    lambda[j] = 1/((double) Constants::scaleFactor) * poissonAttributesGibbsMatrices[i][0][j] * poissonAttributesGibbsMatrices[i][current30MinIntervalIndex][j];
    

    Soweit so gut. Das funktioniert auch wunderbar.

    Jetzt habe ich die Constants.h aber mal ein wenig geändert und sie sieht jetzt folgendermaßen aus:

    static const double scaleFactor = 30;
    

    D.h. ich ersetze einfach int durch double und erhalte dann folgenden Fehler beim Kompilieren:

    g++ -lgsl -o DDoS DDoS.o StatisticsObject.o DataProcessor.o RandomNumberGenerator.o AutolartVector.o GibbsSampler.o ASN_Classifier.o DDoS_Main.o
    Undefined symbols:
    "Constants::scaleFactor", referenced from:
    __ZN9Constants11scaleFactorE$non_lazy_ptr in StatisticsObject.o
    ld: symbol(s) not found
    collect2: ld returned 1 exit status
    make: *** [all] Error 1

    Wieso geht das nicht?



  • Weil du es in der Source-Datei nicht ebenfalls geändert hast.

    Außerdem: 30. anstelle von 30



  • Sorry, ich hatte das schon in 30.0 geändert und es kam/kommt derselbe Fehler. Daran leigt es nicht.



  • Was soll ich denn in welcher Source-File ändern?



  • Eine Initialisierung von statischen Datenelementen einer Klasse ist nur integralen Typen vorbehalten. Warum schreibst Du es nicht so...

    namespace constants {
      const int foo = 42;
      const double bar = 3.1415;
    }
    

    ?

    Warum Du hier eine Klasse missbrauchst, ist mir ein Rätsel.

    kk



  • krümelkacker schrieb:

    Eine Initialisierung von statischen Datenelementen...

    genauer: eine "in-class Initialisierung"


Anmelden zum Antworten