Linker Fehler bei inline const member Funktion



  • Ich bekomme folgenden Linker Fehler

    DialogGaussianBeam.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: double __thiscall GaussianBeam::Waist(void)const " (?Waist@GaussianBeam@@QBENXZ)" in Funktion ""private: void __thiscall DialogGaussianBeam::updateWidgetValues(void)" (?updateWidgetValues@DialogGaussianBeam@@AAEXXZ)".

    wenn ich folgende Funktion benutzt

    inline double GaussianBeam::Waist() const {	return w_0; }
    

    definiert als

    class GaussianBeam : public Laser
    {
    	Q_OBJECT
    public:
    	GaussianBeam(QObject* parent = 0);
    	virtual ~GaussianBeam();
    
    	double Waist() const;
    ...
    

    Warum?


  • Administrator

    Wo steht das folgende?

    inline double GaussianBeam::Waist() const {    return w_0; }
    

    Hast du es im Header drin oder im CPP-File? Ich nehme mal an in der CPP, dann ist dies nämlich der Fehler. Inline definitionen müssen in den Header. Entweder direkt in der Klassendeklaration, oder danach mit inline markiert. Bsp:

    class Test
    {
    public:
      void foo() const { /* implementation */ };
      void bar() const;
    };
    
    inline void Test::bar() const
    {
      /* implementation */
    }
    

    Habe das Zweitere allerdings ehrlich gesagt noch nie gesehen. Macht meiner Meinung nach auch nicht all zu viel Sinn.

    Vielleicht noch als Anmerkung:
    Das Schlüsselwort inline garantiert nicht, dass der Compiler die Funktion auch als inline behandelt, ihre Implementation also direkt einsetzt und keinen Funktionsaufruf durchführt. inline verhindert in C++ nur, dass Mehrfachdefinitionen vorkommen, es ist nur ein Flag für den Compiler.

    Grüssli



  • Dravere schrieb:

    inline void Test::bar() const
    {
      /* implementation */
    }
    

    Habe das Zweitere allerdings ehrlich gesagt noch nie gesehen. Macht meiner Meinung nach auch nicht all zu viel Sinn.

    Wenn man die Klassendefinition übersichtlich halten will, macht das schon Sinn (okay, bei längeren Funktionen ist inline eh nicht angebracht, aber trotzdem). Ich überlasse die Entscheidung wegen inline grundsätzlich dem Compiler, dann kann man auch schön Header und Implementierung trennen. Und so schlimm ist es jetzt auch nicht, wenn Getter in der CPP-Datei stehen...


Anmelden zum Antworten