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 machentemplate<typename T> void __fastcall TForm1::AddMenu(..
bis bald
akari
-
Ei bin ich doof! Danke für die super Hilfestellung!