Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Compiler-Bug oder C++-Standard?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
29.11.2004, 16:20 Uhr
~doppler
Gast


Hallo Leute,
beim Übersetzen des folgenden Codes gibt mir der Compiler den Fehler


Zitat:

In function `int main()':
25: error: no matching function for call to `class3::isClass(bool)'
17: error: candidates are: static bool class3::isClass(const class3&



Das lässt sich zwar durch entfernen der Kommentar-Zeichen in Zeile 18 und 19 leicht ändern, aber ich hätte erwartet, dass der Compiler automatisch erkennt, dass ich nicht die Funktion 'bool isClass(const bool &' überladen möchte, sondern eine neue Funktion 'bool isClass(const class3 &' einführen will.

Weiß jemand, ob das ein Compiler-Bug (gcc 3.3.3) oder C++-Standard ist? Und wenn Standard wieso? Danke.


C++:
#include <iostream>

class class1 {
public:

    virtual bool isClass(const bool & b) const = 0;
};

class class2 : public class1 {
public:
    virtual bool isClass(const bool & b) const {return b;};

};

class class3 : public class2 {
public:
    static bool isClass(const class3& b) {return false;};
//    virtual bool isClass(const bool & b) const
//    {return class2::isClass(b);};
};

int main() {

    class3 test;
    std::cout << "isClass virtual: " << test.isClass(true) << std::endl;
    std::cout << "isClass static:  " << class3::isClass(test) << std::endl;

};

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.11.2004, 17:58 Uhr
~CC2000
Gast


Hallo.
Es scheint so, als ob du dich entscheiden müsstest zwischen static und nicht static. Macht irgendwie auch Sinn, weil das Überladen/Überschreiben entweder nur für die Klassen-Hierarchie oder nur für die Objekt-Hierarchie korrekt ist. Der Compiler wird sich keine Reim darauf machen können, wenn beides gemischt ist - und aus Programmierersicht wäre es wohl auch kaum durchschaubar.
MfG, CC
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.11.2004, 18:38 Uhr
0xdeadbeef
Gott
(Operator)


Das ist schon richtig so. Abschnitt 10.2, Absatz 2 des C++-Standards (ISO/IEC 14882:1998(E)) besagt:

Zitat:

The following steps define the result of name lookup in a class scope, C. First, every declaration for the name in the class and in each of its base class sub-objects is considered. A member name f in one sub-object B hides a member name f in a sub-object A if A is a base class sub-object of B. Any declarations that are so hidden are eliminated from consideration.


Deswegen funktioniert auch folgender Code nicht:

C++:
struct A { virtual void foo() const { } };
struct B : public A { virtual void foo(int x) { } };

int main() {
  B b;
  b.foo();
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.11.2004, 08:02 Uhr
~doppler
Gast


Danke ~CC2000 und Oxdeadbeef für die Antworten.

Ich stimme zu, dass das Ganze aus Programmierersicht kaum durchschaubar ist. Ich brauche es auch nur, um einige meiner älteren Bibliotheken in einen neuen Kontext einzubinden. Insofern hält sich die Verwirrung noch in Grenzen.

Danke für das Zitat aus dem ISO-Standard. Ich hatte mir bisher unter einem Funktionsnamen immer die Funktion mit Argumenten vorgestellt, weil ja in C++ die Argumente immer den richtigen Typ haben müssen und auch Funktionen mit gleichem Namen existieren dürfen, wenn sie unterschiedliche Argumente haben. Deshalb hat mich dieses Verhalten gewundert.
Gut zu wissen, dass das bei Klassen-membern nicht so einfach ist. Das wird in Zukunft vielleicht die Fehlersuche verkürzen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.11.2004, 09:45 Uhr
(un)wissender
Niveauwart


Mich wundert das allerdings auch, da hier offensichtlich eine andere Funktion gemeint ist. Na ja, die Standardleute werden sich dabei schon was gedacht haben.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
30.11.2004, 14:43 Uhr
0xdeadbeef
Gott
(Operator)


Naja - sie haben sich zumindest nen workaround überlegt:

C++:
struct A { virtual void foo() const { } };
struct B : public A {
  using A::foo; // <-- hier
  virtual void foo(int x) { }
};

int main() {
  B b;
  b.foo();
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
30.11.2004, 15:25 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von (un)wissender:
Na ja, die Standardleute werden sich dabei schon was gedacht haben.


Da wäre ich mir nicht so sicher...
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
30.11.2004, 16:45 Uhr
(un)wissender
Niveauwart


@virtual
, vermutlich hast du recht.


Um es nochmal deutlich zu machen, wie es konkret geht:

C++:
#include <iostream>

class class1 {
public:

    virtual bool isClass(const bool & b) const = 0;
};

class class2 : public class1 {
public:
    virtual bool isClass(const bool & b) const {return b;};

};

class class3 : public class2 {
public:
    using class2::isClass;
    static bool isClass(const class3& b) {return false;};
//    virtual bool isClass(const bool & b) const
//    {return class2::isClass(b);};
};

int main() {

    class3 test;
    std::cout << "isClass virtual: " << test.isClass(true) << std::endl;
    std::cout << "isClass static:  " << class3::isClass(test) << std::endl;

}


--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
30.11.2004, 19:04 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


gut zu wissen das es sowas gibt auch wenn ich noch nicht auf so ein problem gestossen bin
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: