Linker-Fehler (Basis-Konstruktor)



  • Ich habe eine eigene Klasse geschrieben, die vom DirectX-Framework ableitet:

    class Filter : public CTransInPlaceFilter
    {
    public:
      Filter(...) : CTransInPlaceFilter(...) {}
      ...
    };
    

    Soweit funktioniert auch alles wunderbar. Jetzt will ich allerdings meinen Konstruktor aus der Klassendefinition raus in die zugehörige Filter.cpp verlagern - und da meldet der Linker plötzlich einen "LNK2001: Nichtaufgelöstes externes Symbol "public __thiscall CTransInPlaceFilter::CTransInPlaceFilter(...)""

    (Nachtrag: Das passiert sogar, wenn ich den Konstruktor im Header, aber hinter der Klassendeklaration anlege)



  • Zeig mal, wie es nach dem Auslagerungsversuch in h und cpp aussieht. 🙂



  • class Filter : public CTransInPlaceFilter
    {
    public:
      Filter(...);
      ...
    };
    
    Filter::Filter(...)
      : CTransInPlaceFilter(...)
    {
    }
    

    (den Methodeninhalt habe ich per Copy&Paste jeweils hin und her verschoben)

    PS: mit einem inline vor der Definition funktioniert es wieder.



  • CStoll (off) schrieb:

    PS: mit einem inline vor der Definition funktioniert es wieder.

    Naja, wenn die Funktion im Header steht, muss imho ein inline davor.
    Mich iritiert mehr, dass ja der Konstruktor der Basisklasse angemeckert wird.

    Hast du mal alles neu erstellt? Manchmal vertut der sich.



  • estartu schrieb:

    CStoll (off) schrieb:

    PS: mit einem inline vor der Definition funktioniert es wieder.

    Naja, wenn die Funktion im Header steht, muss imho ein inline davor.

    Ja, das war mir klar, aber ich will die Funktion ja nicht in den Header (und inline in der Klassendatei macht sich nicht so gut)

    Mich iritiert mehr, dass ja der Konstruktor der Basisklasse angemeckert wird.

    Ja, das hatte mich auch irritiert, deshalb komme ich ja mit dem Problem.

    Hast du mal alles neu erstellt? Manchmal vertut der sich.

    Ja, mehr als einmal.



  • Ich glaube, ich habe den Fehler gefunden: da gab es Verständigungsschwierigkeiten bezüglich der Parametertypen zwischen dem verwendeten Header und der strmbasd.lib - nachdem ich die "richtige" lib eingeklinkt habe, ging es problemlos.

    (bleibt nur noch die Frage, warum er die inline-Version ohne Beanstandungen gelinkt hat 😕 )



  • Ich vermute, das hängt mit dem zusammen, was inline bewirkt.
    Da wird doch was optimiert, vielleicht lags daran. 😕



  • habe mir mal die mühe gemacht und ein bischen text abgeschrieben aus meinem schlauen buch 😉

    schlaues buch schrieb:

    Inline-Funktionen

    Inline-Funktionen sind Funktionen deren Aufrufe im Quelltext der Compiler möglichst nicht durch wirkliche Funktionsaufrufeund das damit verbundene Anlegen eines Stack-Frames auflöst, sondern statt dessen den Anweisungsblock der Funktion so in den Quelltext einbaue, daß dessen Ausführung wirkt, als wäre die Funktion aufgerufen worden.

    jetzt nicht um schlau zu wirken 🙄


Anmelden zum Antworten