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 3class 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 qualifiersthis 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. ]