Ich habe ein merkwürdiges Problem, bei dem der Versuch, inline
der Accessoren für meine "Person" -Klasse auszuführen, dazu führt, dass der Code nicht kompiliert werden kann.
Der folgende Code wird erfolgreich kompiliert und ausgeführt (Using Visual Studio 2012):
Person.h
%Vor%Person.cpp
%Vor%header_test.cpp
%Vor% Wenn ich meine Accessoren so ändere, dass sie als inline
definiert sind, funktioniert der Code.
Einfügen der Accessoren in Person.h
%Vor%Einfügen der Accessoren in Person.cpp
%Vor%Dies führt zu den folgenden Fehlern:
1 & gt; header_test.obj: Fehler LNK2019: nicht aufgelöstes externes Symbol "public: Klasse std :: basic_string, Klasse std :: allocator & gt; __thiscall Person :: Name (void) const" (? Name @ Person @@ QBE? AV? $ Basic_string @ DU? $ Char_traits @ D @ std @@ V? $ Zuordner @ D @ 2 @@ std @@ XZ) referenziert in der Funktion _wmain
1 & gt; schwerer Fehler LNK1120: 1 nicht aufgelöste externe Daten
Gott, diese Fehlermeldung ist kryptisch ... Vielen Dank für all diese so nützlichen Informationen Microsoft / Visual Studio!
Ich weiß, dass das Schlüsselwort inline
nur ein "Hinweis" für den Compiler ist und wahrscheinlich keinen wirklichen Wert hat, aber es sollte trotzdem den Code nicht brechen!
Warum passiert das?
Ich bin kein Sprachanwalt, daher kann ich nicht sagen, ob das Verhalten des Compilers legitim ist oder nicht. Dennoch kann ich erklären, was passiert.
Wenn Sie Ihre Funktionen inline
markieren, sind Sie nicht und weisen den Compiler darauf hin, dass diese Funktion inline eingebunden werden kann. Seit über 10 Jahren brauchen Compiler hier keinen Hinweis. Sie wissen, wann sie inline sind. Stattdessen geben Sie die Funktionsdefinition für jede Übersetzungseinheit an, in der sie enthalten ist. Diese Definition sollte verfügbar sein.
Sie haben gesagt, dass name()
definition lokal für jede .cpp
Datei sein sollte, aber Sie haben sie nicht für jede .cpp
Datei verfügbar gemacht! Ich glaube immer noch, dass der Compiler hier eine Warnung geben könnte.
Sie müssen den Funktionskörper in der Kopfzeile definieren, wenn Sie das Schlüsselwort inline
verwenden möchten. inline
gibt auch mehr als nur einen Hinweis auf den Compiler: Es schließt mehr oder weniger die "one definition" -Regel * ab, bei der Funktionen nur einmal definiert werden.
Darüber hinaus, wenn Sie Klassenmember Funktionen innerhalb der Header definieren, ala
%Vor%Sie erhalten standardmäßig "inline", daher gibt es keinen Grund, das Keyword auszufüllen: -)
* Technisch nicht, aber der Einfachheit halber kann man sich das so vorstellen. Siehe den Kommentar von SergeyA.
Tags und Links c++ header-files visual-studio-2012 inline member-functions