C++-Inlining-Klassenmethoden verursachen undefinierte Referenzen

Lesezeit: 2 Minuten

Ich erhalte einen Compiler-Fehler, wenn ich versuche, eine Methode einer meiner Klassen einzubetten. Es funktioniert, wenn ich das Schlüsselwort “inline” wegnehme.

Hier ist ein vereinfachtes Beispiel:

main.cpp:

#include "my_class.h"

int main() {
  MyClass c;
  c.TestMethod();

  return 0;
}

meine_klasse.h:

class MyClass {
 public:
  void TestMethod();
};

meine_klasse.cpp:

#include "my_class.h"

inline void MyClass::TestMethod() {
}

Ich versuche zu kompilieren mit:

g++ main.cpp my_class.cpp

Ich bekomme den Fehler:

main.cpp:(.text+0xd): undefined reference to `MyClass::TestMethod()'

Alles ist gut, wenn ich das “inline” wegnehme. Was verursacht dieses Problem? (und wie soll ich Klassenmethoden einbetten? Ist das möglich?)

Danke.

Der Rumpf einer Inline-Funktion muss sich im Header befinden, damit der Compiler ihn bei Bedarf tatsächlich ersetzen kann. Sieh dir das an: Wie sagen Sie dem Compiler, dass er eine Member-Funktion inline machen soll?

  • 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


C Inlining Klassenmethoden verursachen undefinierte Referenzen
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:

class MyClass {
 public:
  void TestMethod() {}
};

oder so:

class MyClass {
 public:
  inline void TestMethod();
};

inline void MyClass::TestMethod() {}

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.

    – FrankMN

    22. Januar 11 um 17:54 Uhr

.

729210cookie-checkC++-Inlining-Klassenmethoden verursachen undefinierte Referenzen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy