Falsche Methode wird aufgerufen
-
leider kann ich mir keinen neueren Compiler leisten
Den aktuellen Compiler gibts kostenlos.
-
Ja, ich denke schon. Habe in der abgeleiteten Klasse "using Base::Out;" geschrieben!
@Arschi: Danke für den Link, werd mal sehen, ob es das passende für mich ist.
-
Minimalbeispiel erstellen, hier posten und gut is.
-
ok:
class Log { public: virtual bool Out(const char *pchOut) { printf("char-Pointer\n");}; virtual bool Out(const bool *pbOut) { printf("bool-Pointer\n");}; virtual bool Out(const void *pvOut) { printf("Void-Pointer\n");}; }; class APILog : public Log { using Log::Out; bool Out(USEAPI enOut); } bool APILog::Out(USEAPI enOut) { this->Out("Hallo"); }
Dieses Programm führt zur Ausgabe "Void-Pointer"!
-
Hallo
liegt wohl daran, das alle Pointer auch void-Pointer sind. Deshalb findet der Compiler auch denn "kleinsten" passenden Aufruf mit void *.
bis bald
akari
-
Der Compiler sucht sich doch die am besten passende Methode. Wenn ich das Ganze mit der Basisklasse alleine teste, ruft er ja auch die char-Pointer Methode auf, und nicht die void-Pointer Methode.
Grüße
Jens
-
Dieses Programm führt zur Ausgabe "Void-Pointer"!
Also nachdem ich die kleinen Syntaxfehler mal entfernt habe, ruft mein VC 6.0 auch völlig korrekt die const char-Variante auf.
Welches Service-Pack hast du installiert?
-
Ja ich hab diesen Prototyp auch mal getestet und da funktioniert es auch. Kann ja mal die komplette Deklaration beider Klassen posten, wenn's niemandem was ausmacht.
Es dürfte das "neueste" Service-Pack sein (SP 5).
-
JensE schrieb:
Ja ich hab diesen Prototyp auch mal getestet und da funktioniert es auch. Kann ja mal die komplette Deklaration beider Klassen posten, wenn's niemandem was ausmacht.
Sinnvoller wäre es, wenn du dir eine Kopie deines Projekts anlegst und dort alles entfernst, was nicht direkt zum Problem beiträgt. Sprich: Poste bitte ein minimales Beispiel in dem der Fehler noch auftritt.
-
Bitte nicht hauen und fragt euch vor allem nicht "Warum hat er das bloß gemacht". Hier also die gekürzte Deklaration beider Klassen:
namespace Log { class CLog { public: virtual bool Out(int nOut, DWORD dwFlags = 0); virtual bool Out(char chOut, DWORD dwFlags = 0); virtual bool Out(bool bOut, DWORD dwFlags = 0); virtual bool Out(BYTE nOut, DWORD dwFlags = 0); virtual bool Out(SBYTE snOut, DWORD dwFlags = 0); virtual bool Out(WORD wOut, DWORD dwFlags = 0); virtual bool Out(SWORD swOut, DWORD dwFlags = 0); virtual bool Out(DWORD dwOut, DWORD dwFlags = 0); virtual bool Out(SDWORD sdwOut, DWORD dwFlags = 0); virtual bool Out(QWORD qwOut, DWORD dwFlags = 0); virtual bool Out(SQWORD sqwOut, DWORD dwFlags = 0); virtual bool Out(float fOut, DWORD dwFlags = 0); virtual bool Out(double dOut, DWORD dwFlags = 0); virtual bool Out(long double ldOut, DWORD dwFlags = 0); virtual bool Out(int *pnOut, DWORD dwFlags = 0, DWORD dwContentCount = 0); virtual bool Out(int *pnStart, DWORD dwFlags, DWORD dwDimCount, DWORD *pdwElementCount); // hier für jeden weiteren Basis-Pointer-Typ je zwei Ausgabemethoden }; class APILog : public CLog { public: using CLog::Out; bool Out(USEAPI enOut, DWORD dwFlags = 0); }; }
Vielleicht sieht jetzt jemand einen Fehler.
Sinnvoller wäre es, wenn du dir eine Kopie deines Projekts anlegst und dort alles entfernst, was nicht direkt zum Problem beiträgt. Sprich: Poste bitte ein minimales Beispiel in dem der Fehler noch auftritt.
Ok, das werde ich mal machen.
-
Habe das Ganze darauf reduziert, dass nur noch Pointer-Methoden für bool, void und char enthalten sind. Wenn ich die für den void-Pointer drin hab, wird diese statt const char* aufgerufen. Wenn ich sie rausnehme, wird nicht etwa const char* oder const bool* aufgerufen, sondern Out(bool), und nichtma Out(int), was man wohl eher erwartet hätte!!!! Bzw. ich hätte nicht erwartet, dass ein Compiler einen bool als passend für const char* empfindet.
Ist wohl irgendein komisches Problem mit unpassenden obj-Files oder so!?!?
-
Bzw. ich hätte nicht erwartet, dass ein Compiler einen bool als passend für const char* empfindet.
Prinzipiell kann ein const char* natürlich in ein bool konvertiert werden. Der Nullpointer wird zu false, alle anderen zu true.
Eine Konvertierung von const char* -> int auf der anderen Seite ist nicht möglich, da dazu zwei Standardkonvertierungen in Folge nötig wären (was niemals gemacht wird).Ist wohl irgendein komisches Problem mit unpassenden obj-Files oder so!?!?
Das solltest du herausfinden. Wenn du dann ein Beispiel postest wäre neben der Minimalität auch kompilierbarkeit eine erstrebenswerte Eigenschaft
-
Also das mit den minimalen Beispiel kriegen einige echt nicht auf die Reihe.
-
hmmmmmmm schrieb:
Also das mit den minimalen Beispiel kriegen einige echt nicht auf die Reihe.
Manche Leute haben anscheinend zu viel Zeit.
Problem ist gelöst, mit neuerem Compiler (Visual C++ Express 2005 Beta) ging es.