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?
-
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üsselwortinlinegarantiert nicht, dass der Compiler die Funktion auch alsinlinebehandelt, ihre Implementation also direkt einsetzt und keinen Funktionsaufruf durchführt.inlineverhindert 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
inlineeh nicht angebracht, aber trotzdem). Ich überlasse die Entscheidung wegeninlinegrundsä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...