Hard nut to crack ... (GCC bug???)



  • Folgendes Problem:
    Wenn man die untenstehende Konstruktion mit g++ kompilieren will, spuckt der Compiler eine wirre Fehlermeldung aus. Das Problem ist mir schon klar: Die beiden Klassen beziehen sich aufeinander. Aber es ist nach C++-Standard richtig formuliert, und kann ja nicht unmöglich sein. Unter Windows (Borland,MS,Metrowerk) geht die Sache ohne Probleme durch. Wo hat g++ das Problem. Gibt es irgendeine Option... Wer kann helfen?

    Hier das Klassenwirrwarr 🙂 :

    /////////////////////////////////////////////////////////////

    class RefCount;

    class Adr
    {
    public:
    Adr() {ptr=0;}
    Adr(Adr& b) { ptr= b.ptr;}
    Adr(RefCount* p) {ptr=p;}
    RefCount& operator*() { return ptr;}
    protected:
    RefCount
    ptr;
    };

    class RefCount
    {
    public:
    RefCount() {count=0;}
    RefCount(int n) {count=n;}
    int& getRefs() { return count;}
    Adr operator&(){ return Adr(this);}
    private:
    int count;
    };

    //////////////////////////////////////////////////////



  • Hol dir doch einfach den aktuellsten GCC. Damit klappt's



  • wenn es nur eine Warnung ist, dann ist es ja nicht so schlimm.

    Welche Warnung meldet er den?



  • Es ist keine Warnung sondern ein Fehler das spuckt er dann aus:

    Reference.h: In method 'class Adr RefCount::operator&() const':
    Reference.h:30: passing 'const RefCount *' as argument 1 of 'Adr::Adr(RefCount *)' discards qualifiers
    Reference.h:30: initialization of non-const reference type 'class Adr&'
    Reference.h:30: from rvalue of type 'Adr'
    Reference.h:16: in passing argument 1 of 'Adr::Adr(Adr &)'

    Ich habe gcc version 2.95.2 19991024 (doch schon etwas älter).

    Hier noch die ganze .h Datei zum Rauskopieren und Testen:

    #ifndef Referenz_h
    #define Referenz_h

    // Reference.h RS 16.04.1991
    // .HEADER image processing classes
    // .NAME Reference
    // .FILE Reference.h
    // .LIBRARY 3

    class RefCount;

    class Adr
    {
    public:
    Adr() {ptr=0;}
    Adr(Adr& b) { ptr= b.ptr;}
    Adr(RefCount* p) {ptr=p;}
    RefCount& operator*() { return ptr;}
    protected:
    RefCount
    ptr;
    };

    class RefCount
    {
    public:
    RefCount() {count=0;}
    RefCount(int n) {count=n;}
    int& getRefs() { return count;}
    Adr operator&() const { return Adr(this); }
    private:
    int count;
    };

    #endif

    [ Dieser Beitrag wurde am 11.10.2002 um 17:57 Uhr von agrimm editiert. ]



  • Die Fehler sind ja auch berechtigt:

    Reference.h: In method 'class Adr RefCount::operator&() const':
    Reference.h:30: passing 'const RefCount *' as argument 1 of 'Adr::Adr(RefCount *)' discards qualifiers

    this ist ja auch vom Typ const Adr::Adr(RefCount*) erwartet aber ein nicht const Objekt. Siehe const-correctness

    außerdem solltest du lieber initalisierungs Listen benutzen, da die schneller sind, als Zuweisungen im ctor



  • Wenn man das const weglässt funzts. Franx Ruedi.
    Aber warum akzeptieren das alle Windows/DOS-Compiler ? Das Projekt kommt ursprünglich aus irgendeiner Workstation-Umgebung auf UNIX-Basis und auch da ist es ja durchgegangen.
    Zur letzten Anm.: Die Sache ist schon ziemlich in das Projekt eingewebt, eine Änderung würde Jahre dauern.

    [ Dieser Beitrag wurde am 12.10.2002 um 12:23 Uhr von agrimm editiert. ]


Anmelden zum Antworten