Ich erhalte einen Compiler-Fehler, wenn ich versuche, eine Methode einer meiner Klassen einzubetten. Es funktioniert, wenn ich das Schlüsselwort “inline” wegnehme.
Der Link führt auf die Seite mit You do not have permission to access the requested file on this server. Error
– VL-80
7. März 16 um 15:27 Uhr
Steve Jessop
7.1.2/4 der Norm:
Eine Inline-Funktion muss in jeder Übersetzungseinheit definiert werden, in der sie verwendet wird…
Sie verwenden TestMethod in main.cpp, aber es ist dort nicht definiert.
… Wenn eine Funktion mit externer Verknüpfung in einer Übersetzungseinheit inline deklariert wird, muss sie in allen Übersetzungseinheiten, in denen sie erscheint, inline deklariert werden; Es ist keine Diagnose erforderlich.
Sie definieren (und deklarieren daher auch) TestMethod inline in my_class.cpp, aber nicht in main.cpp.
Die Lösung in diesem Fall besteht darin, die Funktionsdefinition in die Header-Datei zu verschieben, entweder wie folgt:
Sie haben es in der Header-Datei als nicht inline definiert, während Sie in der cpp-Datei versuchen, es als inline zu definieren. Das ist eine widersprüchliche Definition und es wird nicht möglich sein, eine von der anderen zu finden. Ihr Header ist der Ort, an dem Sie das Inline-Keyword wirklich platzieren.
Ich würde jedoch das Inline-Schlüsselwort entfernen, da es ohnehin eher ein Vorschlag für den Compiler ist. Sie brauchen es wirklich nur, wenn der Header eine frei schwebende Funktion enthält und Sie nicht möchten, dass mehrere Definitionen in Ihrer Codebasis auftauchen.
inline Schlüsselwörter sind sicherlich nicht nur ein Hinweis, zumindest in C++ – sie weisen den Compiler an, die Definition schwach zu machen und sie nur bei Bedarf auszugeben. Das heißt, es muss dort vorhanden sein, wo es verwendet wird, kann aber auch mehrfach enthalten sein
– bdonlan
22. Januar 11 um 17:53 Uhr
Ich erhalte immer noch einen Fehler, egal wo ich die Inline einfüge (oder ob ich Inline in beide einfüge). Von den 4 Kombinationen (inline in my_class.h und/oder in my_class.cpp) funktioniert nur die ohne Inline irgendwo.