Compilermeldung verstehen ...



  • Morgen,

    folgender kleiner Code-Auszug macht mir Probleme:

    inline void timer::conv_tival_to_ms(const timeval& tival, unsigned long& ms) {
    
      ms = (tival.tv_sec * FACTOR) + (tival.tv_usec / FACTOR);
    }
    
    inline unsigned long timer::get_interval() const {
    
      unsigned long ms;
      conv_tival_to_ms(m_intv.it_interval, ms);
      return ms;
    }
    

    GCC 4.1 schrieb:

    timer.hpp:64: error: passing ‘const timer’ as ‘this’ argument of ‘void timer::conv_tival_to_ms(const timeval&, long unsigned int&)’ discards qualifiers

    Wie der Name schon sagt, konvertiert die Memberfunktion conv_tival_to_ms einen timeval - Wert (Struktur die Sekunden und Microsekunden enthält) in Millisekunden. Die Klasse timer hat einen Member m_int der vom Typ timeval ist. Die Memberfunktion get_interval macht nun nichts weiter als den Member m_int in Millisekunden zu konvertieren und ihn in eine Temporäre Variable zu speichern und anschließend zurückzuliefern. Leider meckert egnau an dabei der Compiler und ich die Fehlermeldung bringt mich nicht weiter. Offensichtlich mag er nicht, dass get_interval als konstant deklariert ist, es lässt sich auch kompilieren wenn sie das nicht mehr ist ... nur verstehe ich den Grund nicht. Die Methode rührt doch keinen Klassen-Member an?!

    MfG



  • wnx schrieb:

    Offensichtlich mag er nicht, dass get_interval als konstant deklariert ist,

    Nein, das Problem ist eher, dass es conv_tival_to_ms nicht ist. Du kannst aus einer const-Methode keine nicht-const-Methode aufrufen.



  • Du rührst aber in get_interval eine Methode an, die nicht const deklariert ist. Und diese widerum könnte Member anrühren. D.h. die conv_tival_to_ms muss auch als const deklariert sein.

    Da so wie ich das sehe die conv_tival_to_ms Methode noch nichtmal irgendein Member liest, könntest Du diese alternativ aber auch static deklarieren.



  • get_interval ist eine const-Methode (das heißt, die bekommt ihren this-Zeiger als "const timer*") und ruft die nicht-konstante Methode conv_tival_to_ms() auf. Bei nicht-konstanten Methoden geht der Compiler davon aus, daß sie ihr this-Objekt ändern wollen - deshalb sind sie nicht für konstante Objekte erlaubt.

    Als Lösung könntest conv_tival_to_ms() entweder auch const setzen oder (da sie sowieso nichts mit ihrem this-Objekt macht) als statische MEthode definieren.


Anmelden zum Antworten