Unresolved external??



  • Hi. erkennt wer zufällig hier den Fehler? Ich bekomme diese doofe Meldung!

    [Linker Fehler] Unresolved external 'TFrame1 * __fastcall TForm1::Insert<TFrame1>(System::TObject *, int, int)' referenced from C:\..\Frame1.obj

    Ich habe mehrere TFrames und erstelle bei Programmstart entsprechende MainMenu Einträge

    AddMenu<TFrame1>("Frame1", 1, "Sub1", 1);
    AddMenu<TFrame2>("Frame2", 1, "Sub1", 1);
    

    Im Quelltext des Frames gibt es eine Funktion die aufgerufen werden soll, wenn der Menüeintrag über OnClick ausgewählt wurde und hier scheint der Teufel begraben zu sein, denn ohne diese OnClick Zeile gibt es keine Fehlermeldung.
    Woran könnte das liegen?

    Form1 Quelle

    template<typename T>T* __fastcall TForm1::AddMenu(AnsiString mCaption, int mTag, AnsiString sCaption, int sTag)
    {
    //....Code
    T* Modul;
    SubItem->OnClick = Modul->InsertToForm;
    //....Code
    }
    
    template<typename T>T* __fastcall TForm1::InsertFrame(TObject *Sender, int X, int Y)
    {
    }
    

    Form1 Header

    class TForm1 : public TForm
    {
    private:
    template<typename T>T* __fastcall AddMenu(AnsiString mCaption, int mTag, AnsiString sCaption, int sTag);
    public:
    template<typename T>T* __fastcall InsertFrame(TObject *Sender, int X = -1, int Y = -1);
    };
    

    Frame1 Quelle

    void __fastcall TFrame1::InsertToForm(TObject *Sender)
    {
        Form1->InsertFrame<TFrame1>(Sender);
    }
    

    Gestern ging das noch, keine Ahnung was ich heute damit anegstellt habe und ich sehe einfach nicht das Problem. 😡



  • Wenn du BCB 6 oder früher hast, könnte es helfen die obj dateien zu löschen und neu zu Compilieren.



  • Ich versuch mal einfacher zu umschreiben

    Quelle

    //---------------------------------------------------------------------------
    template<typename T>T* __fastcall TForm1::Test()
    {
        ShowMessage("xxx");
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    // Wenn man diese Zeile auskommentiert kommen keine Compiler Fehler mehr
        Frame1->InsertToForm(Sender);
    }
    //---------------------------------------------------------------------------
    

    Header

    class TForm1 : public TForm
    {
    public:
    template<typename T>T* __fastcall Test();
    };
    

    Frame1

    //---------------------------------------------------------------------------
    void __fastcall TFrame1::InsertToForm(TObject *Sender)
    {
        Form1->Test<TFrame1>();
    }
    //---------------------------------------------------------------------------
    


  • @JBOpael: Das entfernen der OBJ-Dateien hat leider nichts gebracht.



  • Hallo

    Alter Fehler mit Templates : Bei Templates reicht es nicht nur die Deklaration über den Header bekannt zu machen. Sondern auch die Implementation muß überall dort bekannt sein wo das das Template verwendet wird. Also verschieb die Templatemethoden wieder ganz in den Header und der unresolved-Fehler sollte verschwinden.

    bis bald
    akari



  • Yatta! Das hat schonmal geholfen! Vielen Dank, auch wenn ich das nicht wirklich verstehe, zumal es mit diesem Aufbau gestern noch ging. Ich habe heute lediglich diverse andere Funktionen in eine andere CPP umgelagert.



  • Hallo

    Es gibt nur zwei Möglichkeiten :
    - Du hast vorher die Implementationen der Templates im Header stehen
    - Du hast vorher die Templates nur in "Quelle" benutzt. Dort sind ja die Implementationen auch so bekannt. Nicht aber in "Frame".

    bis bald
    akari



  • Kleine Zusatzfrage. Was mach ich eigentlich mit dieser Warnung für die Definition eines Templates?

    W8070 Funktion sollte einen Wert zurückgeben.

    Wie gibt man dort eigentlich Werte zurück? Ich kann mein void hinsetzen wo ich mag, erhalte immer "Deklaration nicht ordnungsgemäß abgeschlossen" zurückgeworfen.



  • Hallo

    Deine Templatemethode hast doch einen Rückgabetyp : T*!
    Wenn du den nicht willst must du schon void draus machen

    template<typename T> void __fastcall TForm1::AddMenu(..
    

    bis bald
    akari



  • Ei bin ich doof! Danke für die super Hilfestellung!


Anmelden zum Antworten