Frage zu __closure



  • Hallo zusammen,
    ich nutze den C++Builder 6 und will dabei Callback-Funktionen nutzen. Ansich funktioniert das auch sehr gut, außer in einem Fall.
    Ich habe zwei Methoden, die in der selben Klasse den gleichen Namen haben und sich nur durch die Parameterliste unterscheiden. Wenn ich nun dem Pointer auf die Funktion setzen will, zeigt mir der C++Builder an, dass er die Methode nicht eindeutig identifizieren kann.

    Hier die Fehlermeldung:

    [C++ Fehler] MainForm.cpp(4080): E2336 Zeiger auf überladene Funktion 'TFormMain::ClearHintText' stimmt nicht mit 'void (_fastcall * (_closure )())()' überein

    Und die Stelle im Code

    FormSetup->ClearHintText = ClearHintText;
    

    Die Methode ClearHintText gibt es mit den Parametern (void) oder mit (char *errText). Kann mir jemand sagen, wie ich in diesem Fall eine eindeutige Zuweisung bekomme?



  • Hallo

    kann ich nicht nachvollziehen. Ich hab mal ein Beispiel nachgebaut

    typedef void __fastcall (__closure *TTestEvent1)(char *errText);
    typedef void __fastcall (__closure *TTestEvent2)(void);
    ...
    void __fastcall TForm1::Test1(char *errText)
    {
      }
    
    void __fastcall TForm1::Test2(void)
    {
      }
    ...
      TTestEvent1 MyEvent1;
      MyEvent1 = Test1; // geht
    //  MyEvent1 = Test2; // geht nicht, wie zu nerwarten
      TTestEvent2 MyEvent2;
    //  MyEvent2 = Test1; // geht nicht, wie zu erwarten
      MyEvent2 = Test2; // geht
    

    Das Problem muß woanders liegen. Schreib dohc mal die genauen Definitionen der beteilgiten Typen und Methoden.

    bis bald
    akari



  • In seinem Fall heißen wohl beide Methode Test1 bzw. ClearHintText...



  • Wie du vielleicht an deinem eigenen Beispiel sehen kannst, unterscheiden sich deine beiden Methoden nicht nur in der Parameterliste.

    Nenne doch mal beide Test und versuche das noch einmal (also ohne die Nummern dahinter).

    Das dürfte bei dir dann auch nicht klappen (oder ich habe wirklich einen anderen Fehler).



  • Hallo

    achso, klar überladene Methoden.
    Tja, Ich seh da außer dem Vergeben von unterschiedlichen Namen nur die Möglichkeit einer einzelnen Methode, die dann für den char-parameter den Standardwert NULL bekommt. Dann kannst du in der Methode entscheiden, welche Variante du ausführst.
    Und kannst immer noch die Methode mit beiden Varianten aufrufen.

    bis bald
    akari



  • Danke für den Hinweis. Sowas habe ich leider schon befürchtet. Gibt es denn einen anderen Weg, zwei Klassen in diesem Fall von einander zu kapseln?

    In meinem Fall sollen die beiden Klassen von einander getrennt werden, weil sonst bei jeder Änderung an einer ein ganzer Haufen von Klassen compiliert werden muss. Dann heißt es erst mal 10-15min warten, was nicht sehr sinnvoll ist.
    Vielleicht kennt hier ja jemand noch eine andere Möglichkeit.



  • Nur kurz zur Info:
    Ich habe jetzt beide Methode zusammengenommen. Dann geht es natürlich mit __closure wieder.

    Daher ist meine letzte Anfrage eher von allgemeiner Natur. Vielleicht kennt da ja jemand einen Trick oder sowas. Oder man sollte mal bei Borland direkt anfragen, denn wahrscheinlich ist das von denen doch auch nicht so gedacht, oder?

    Trotzdem nochmal Danke *g*


Anmelden zum Antworten