Konstanten in Header-Datei (map<>)



  • Ach ich Idiot, es liegt gar nicht an der Header 🙂
    Danke für den Hinweis; komplett übersehen. Ich greife auf diese Map wie folgt zu:

    return AFC::Constants::AW[atom] * stod(multiplicator);
    

    Die Variable "atom" beinhaltet einen string.

    Wenn ich die map mit const definiere erhalte ich folgenden Fehler:

    thermo/thermoReader.cpp: In member function 'AFC::scalar AFC::ThermoReader::calcWeight(const word&, const string&, const word&)':
    thermo/thermoReader.cpp:174:30: error: no match for 'operator[]' (operand types are 'AFC::map<std::basic_string<char>, double> {aka const std::map<std::basic_string<char>, double, std::less<std::basic_string<char> >, std::allocator<std::pair<const std::basic_string<char>, double> > >}' and 'const word {aka const std::basic_string<char>}')
         return AFC::Constants::AW[atom] * stod(multiplicator);
    

    Ich schau mal nochmals nach wie ich die map richtig aufrufe.


  • Mod

    Das kommt wiederum davon, dass man den Operator[] nicht auf konstante Map-Objekte anwenden kann, da er die Map potentiell verändern kann.



  • Okay danke, dass wusst ich auch noch nicht. Habs nun mit ".at()" gelöst.



  • Noch was vergessen.

    Die Map wird alle chemischen Elemente und deren Atomgewicht enthalten. Empfiehlst du dann die extern Variante oder const?

    WIrd in 2 - 4 Source Files verwendet. Denke die Map ist dann nicht all zu groß und ich kann auch die const-Methode verwenden.

    Danke,
    Tobi



  • SeppJ schrieb:

    sebi707 schrieb:

    PS: Eigentlich müsste deine Map zusammen mit const im Header auch funktionieren. Tut es zumindest bei mir. Was für einen Fehler kriegst du?

    Müsste sie nicht. Klassischer Verstoß gegen die ODR. Streng genommen müssten nicht einmal Fließkommakonstanten funktionieren, nur für Ganzzahlen ist das explizit erlaubt.

    Ist Zeug mit const nicht implizit static ? Wird zumindest mehrfach auf Stackoverflow behauptet. Ich find nur gerade kein Zitat aus dem C++ Standard.



  • sebi707 schrieb:

    SeppJ schrieb:

    sebi707 schrieb:

    PS: Eigentlich müsste deine Map zusammen mit const im Header auch funktionieren. Tut es zumindest bei mir. Was für einen Fehler kriegst du?

    Müsste sie nicht. Klassischer Verstoß gegen die ODR. Streng genommen müssten nicht einmal Fließkommakonstanten funktionieren, nur für Ganzzahlen ist das explizit erlaubt.

    Ist Zeug mit const nicht implizit static ? Wird zumindest mehrfach auf Stackoverflow behauptet. Ich find nur gerade kein Zitat aus dem C++ Standard.

    Heißt ich sollte also mit extern und Source + Header arbeiten? Definiere nämlich auch einige Double in der Header.



  • sebi707 schrieb:

    Ich find nur gerade kein Zitat aus dem C++ Standard.

    Gefunden:

    §3.5 Abs. 3 schrieb:

    A name having namespace scope (3.3.6) has internal linkage if it is the name of
    — a variable, function or function template that is explicitly declared static; or,
    a variable of non-volatile const-qualified type that is neither explicitly declared extern nor previously declared to have external linkage; or
    — a data member of an anonymous union.


  • Mod

    sebi707 schrieb:

    sebi707 schrieb:

    Ich find nur gerade kein Zitat aus dem C++ Standard.

    Gefunden:

    §3.5 Abs. 3 schrieb:

    A name having namespace scope (3.3.6) has internal linkage if it is the name of
    — a variable, function or function template that is explicitly declared static; or,
    a variable of non-volatile const-qualified type that is neither explicitly declared extern nor previously declared to have external linkage; or
    — a data member of an anonymous union.

    Interessant. Dann müsste es eigentlich funktionieren.

    Shor-ty schrieb:

    Heißt ich sollte also mit extern und Source + Header arbeiten? Definiere nämlich auch einige Double in der Header.

    Wenn du mich fragen würdest, würde ich gar keine Map für diesen Zweck einsetzen. Du wünscht dir doch sicherlich echte Compilezeitkonstanten (wozu sonst der Aufwand?), was aber von der Map effektiv verhindert wird.



  • Wenn du mich fragen würdest, würde ich gar keine Map für diesen Zweck einsetzen. Du wünscht dir doch sicherlich echte Compilezeitkonstanten (wozu sonst der Aufwand?), was aber von der Map effektiv verhindert wird.

    Zu was würdest du denn raten?


  • Mod

    Shor-ty schrieb:

    Zu was würdest du denn raten?

    Ganz einfach ohne map:

    namespace AW
    {
      const double H = 1.00790;
      // ...
    }
    

Anmelden zum Antworten