Bitte Hilfe: Invalid use of incomplete type / log() error



  • Gut, ich sehe ein, dass

    class progEvent;
    

    in der myClass.h eine Vorwärtsdeklaration darstellt. Wenn ich das richtig verstanden habe, dann brauche ich das um dem Linker zu sagen, "Achtung gleich kommt was, dass heißt progEvent. Kümmere dich nicht darum, ich sage dir später was das ist!" Die Klasse selber ist in der Datei prog_event.h definiert. Und eben diese Datei habe ich auch in der myClass.cpp eingebunden. Dass ist falsch oder wie? Wenn ich SeppJ richtig verstanden habe, dann muss ich die Definition von progEvent auch in der myClass.h machen? Dann wird die Klasse aber 2x definiert, oder nicht? Kannst du mir das etwas näher erklären, oder hast du einen Link an der Hand?

    Thema Logarithmus:

    Zu der Zeile mit dem log: Nun, was ist log? Der Logarithmus aus cmath heißt std::log.

    Naja, wenn ich das so ausprobiere, dann meckert der Compiler mit dem Hinweis "log is not a member of std" (Was ein wenig merkwürdig ist, da ich dachte (korrigiert mich wenn ich mich irre), dass std alle Standartfunktionen von c enthält?!?). Wenn ich mir dass hier anschaue: http://www.cplusplus.com/reference/clibrary/cmath/log/ oder auch in den paar Büchern, die ich hier auf dem Schreibtisch habe, steht immer so was wie

    #include <math.h>
    //...//
    float logVonX = log(x);
    //...//
    

    Also was mache ich falsch?



  • waschbaerFurcht schrieb:

    ...

    Darf ich mal fragen mit was für einen Compiler (& Version) du arbeitest?

    waschbaerFurcht schrieb:

    Naja, wenn ich das so ausprobiere, dann meckert der Compiler mit dem Hinweis "log is not a member of std" (Was ein wenig merkwürdig ist, da ich dachte (korrigiert mich wenn ich mich irre), dass std alle Standartfunktionen von c enthält?!?).

    In den C-Kompatibilitätsheadern sollten alle C-Funktionen auch im std-Namensraum enthalten sein. Das du es in ein paar Büchern usw. mit der <.h> Notation siehst liegt entweder daran, das es ein C Sourcecode oder das Buch veraltet ist (Die Notation mit <cmath> ist im C++ Standard von 1998 verabschiedet wurden, manche Autoren sind aber sehr, sehr träge - Gerade im Hochschulbereich).


  • Mod

    waschbaerFurcht schrieb:

    Gut, ich sehe ein, dass

    class progEvent;
    

    in der myClass.h eine Vorwärtsdeklaration darstellt. Wenn ich das richtig verstanden habe, dann brauche ich das um dem Linker zu sagen, "Achtung gleich kommt was, dass heißt progEvent. Kümmere dich nicht darum, ich sage dir später was das ist!" Die Klasse selber ist in der Datei prog_event.h definiert. Und eben diese Datei habe ich auch in der myClass.cpp eingebunden. Dass ist falsch oder wie? Wenn ich SeppJ richtig verstanden habe, dann muss ich die Definition von progEvent auch in der myClass.h machen? Dann wird die Klasse aber 2x definiert, oder nicht? Kannst du mir das etwas näher erklären, oder hast du einen Link an der Hand?

    Das konnte ich nicht sehen, dass die vollständige Deklaration eingebunden wurde, weil du nicht alles gezeigt hast. Die Fehlermeldung 'Invalid use of inclomplete type XXX' bedeutet eigentlich immer, dass von XXX bloß eine Vorwärtsdeklaration bekannt ist, an dieser Stelle aber Detailsinformation über die Member von XXX nötig ist. Deshalb auch Gegenfrage an dich: Was ist bei dir XXX?

    Thema Logarithmus:

    Zu der Zeile mit dem log: Nun, was ist log? Der Logarithmus aus cmath heißt std::log.

    Naja, wenn ich das so ausprobiere, dann meckert der Compiler mit dem Hinweis "log is not a member of std" (Was ein wenig merkwürdig ist, da ich dachte (korrigiert mich wenn ich mich irre), dass std alle Standartfunktionen von c enthält?!?). Wenn ich mir dass hier anschaue: http://www.cplusplus.com/reference/clibrary/cmath/log/ oder auch in den paar Büchern, die ich hier auf dem Schreibtisch habe, steht immer so was wie

    #include <math.h>
    //...//
    float logVonX = log(x);
    //...//
    

    Also was mache ich falsch?

    Eigentlich sollte in den Headern mit .h am Ende alles im globalen Namensbereich liegen (für die Abwärtskompatibilität mit C) und in den Headern die mit c anfangen alles im Namensbereich std. Wenn es bei dir anders ist, dann ist das nicht dein Fehler sondern der von deiner Implementierung.



  • Ich arbeite mit g++ in Version 4.4.1
    Ich habe mal den include auf #include<cmath> geändert, und siehe da, der Compiler ist still für "std::log". das heißt also, dass cmath im Gegensatz zu math.h jetzt standard Cpp ist? Ich dachte das ist kompatibel? Aber es geht. Super! danke euch!

    Jetzt bleibt nur die Sache mit dem "Invalid use of incomplete type"



  • progevent.vectior1
                  ^
    

    Ist das ein Schreibfehler?
    Und ich nehme an du hast keine Include-Guards.

    Ansonsten vertausch die Includes von prog_event und myClass in der myClass.cpp



  • waschbaerFurcht schrieb:

    ...das heißt also, dass cmath im Gegensatz zu math.h jetzt standard Cpp ist?

    Jetzt ist gut... Wie gesagt ist der C++ Standard 1998 verabschiedet worden, und der nächste C++ Standard folgt nach derzeitigen Stand 2011 (es sei den es werden noch gravierende Fehler gefunden).



  • SeppJ schrieb:

    Das konnte ich nicht sehen, dass die vollständige Deklaration eingebunden wurde, weil du nicht alles gezeigt hast. Die Fehlermeldung 'Invalid use of inclomplete type XXX' bedeutet eigentlich immer, dass von XXX bloß eine Vorwärtsdeklaration bekannt ist, an dieser Stelle aber Detailsinformation über die Member von XXX nötig ist. Deshalb auch Gegenfrage an dich: Was ist bei dir XXX?

    Ok, ich werde mal versuchen das vollständig zu posten. Also da gibts dann

    //prog_event.h
    namespace prog
    {
      namespace part0
      {
        class part0Event;
      }
      namespace part1
      {
        class part1Event;
      }
      //...//
      class progEvent
      {
        public:
        progEvent();
        ~progevent();
    
        part0::part0Event &part0Event() {return *_part0Event;}
        part1::part1Event &part1Event() {return *_part1Event;}
        //...//
      };
    }
    
    //part0_event.h
    #include <vector>
    #include <stdint.h>
    #include "detector.h"
    namespace prog
    {
      namespace part0
      {
        class part0Event
        {
          public:
            typedef std::vector<detect> Vdetector; //detect steht in "detector.h"
          public:
            part0Event(void) {};
            ~part0Event()    {};
          public:
            Vdetector &detector() {retrun _detector;}
            //...//
        };
      }
    }
    

    So etwas ähnliches gibt es natürlich auch für part1Event, ... usw. also für die unterschiedlichen Detektoren, die von dem Programm nachher ausgewertet werden sollen. Die ganze Klasse kompiliert auch prima und wurde schon diverse Male benutzt. Ich schaffe es nur nicht sie in myClass zu benutzen...



  • Du greifst auf das Element "vectior1" der Klasse progElement zu - dieses Element gibt es aber gar nicht (nach deiner eben geposteten Definition).



  • l'abra d'or schrieb:

    progevent.vectior1
                  ^
    

    Ist das ein Schreibfehler?
    Und ich nehme an du hast keine Include-Guards.

    Ansonsten vertausch die Includes von prog_event und myClass in der myClass.cpp

    Ja ist ein Tippfehler, den es im original Code nicht gibt.

    Doch ich habe Include-Guards, hier habe ich sie nur weggelassen...

    Das vertauschen hat nix gebracht.



  • asc schrieb:

    waschbaerFurcht schrieb:

    ...das heißt also, dass cmath im Gegensatz zu math.h jetzt standard Cpp ist?

    Jetzt ist gut... Wie gesagt ist der C++ Standard 1998 verabschiedet worden, und der nächste C++ Standard folgt nach derzeitigen Stand 2011 (es sei den es werden noch gravierende Fehler gefunden).

    Na gut, '98, das ist ne weile her... Aber warum hält es sich dann in Literatur und Netz so hartnäckig? Ich meine, wenn ich ein Buch aus dem Jahr 2006 benutze, dann sollte ich doch davon ausgehen, dass dir Autor auch mal ausprobiert, was er da verzapft, oder wenigstens der Verlag! DAS kann ich für knapp 70€ doch wohl erwarten. Nur so am Rande.



  • Reduzier dein Problem auf ein Minimales Beispiel, welches beim Versuch zu kompilieren den Fehler reproduzieren lässt.
    Dabei solltest du schauen, dass die includes, forward declarations, include_guards usw. so wie im Originalquelltext eingesetzt sind.
    Ansonsten bleibt nur Raten...



  • waschbaerFurcht schrieb:

    Na gut, '98, das ist ne weile her... Aber warum hält es sich dann in Literatur und Netz so hartnäckig?

    Lernresistenz.

    waschbaerFurcht schrieb:

    Ich meine, wenn ich ein Buch aus dem Jahr 2006 benutze, dann sollte ich doch davon ausgehen, dass dir Autor auch mal ausprobiert, was er da verzapft,...

    Da viele Compiler noch damit klar kommen, auch wenn es nicht den Standard entspricht, denken sich viele wohl: Warum was neues nehmen, wenn das alte noch läuft. Meist sind dies auch die Personen für die, die STL nicht zu C++ gehört, obwohl sie Teil der C++ Standardbibliothek ist, und diese laut C++ Standard nun einmal dazu gehört.

    waschbaerFurcht schrieb:

    ...oder wenigstens der Verlag!... DAS kann ich für knapp 70€ doch wohl erwarten. Nur so am Rande.

    Wieso sollte er? Hauptsache der Titel verkauft sich.

    Das ist wie im Journalismus: Die Wahrheit verkauft sich meist schlechter, wichtig ist doch fast nur noch eine reißerische Überschrift (Selbst wenn sie kaum einen inhaltlichen Bezug hat, oder ihm gar widerspricht).


Anmelden zum Antworten