Wann tritt ein unvollständiger Typfehler in C++ auf

Lesezeit: 3 Minuten

Kann mir jemand sagen, wann ein C++-Compiler einen “unvollständigen Typfehler” auslöst?

Hinweis: Ich habe diese Frage absichtlich etwas offen gelassen, damit ich meinen Code selbst debuggen kann.

  • Ein möglicherweise CV-qualifizierter Typ, der nicht definiert oder ungültig ist, ist ein unvollständiger Typ. Ein Objekt darf nicht als unvollständiger Typ definiert werden. Und nein, das ist kein gutes Frageformat

    – Passant

    7. Juli 2017 um 5:36 Uhr


  • Siehe dies zum Beispiel unter stackoverflow.com/questions/6349822/…

    – Abdulkadir Dalga

    7. Juli 2017 um 5:37 Uhr

  • @PasserBy Ich habe jemanden, der meine Frage beantwortet und mir geholfen hat, den Fehler zu finden. Er war hilfreicher als du. Trotzdem danke.

    – Nikal

    7. Juli 2017 um 9:13 Uhr

Benutzer-Avatar
Mike Lischke

Dies geschieht normalerweise, wenn der Compiler eine Vorwärtsdeklaration, aber keine vollständige Definition dieses Typs gesehen hat, während der Typ irgendwo verwendet wird. Zum Beispiel:

class A;

class B { A a; };

Die zweite Zeile verursacht einen Compilerfehler und meldet je nach Compiler einen unvollständigen Typ (andere Compiler geben Ihnen einen anderen Fehler, aber die Bedeutung ist dieselbe).

Wenn Sie jedoch nur einen Zeiger auf eine solche Vorwärtsdeklaration verwenden, wird es keine Beanstandung geben, da die Größe eines Zeigers auf eine Klasse immer bekannt ist. So was:

class A;
class B {
   A *a;
   std::shared_ptr<A> aPtr;
};

Wenn Sie fragen, was in einer konkreten Anwendung oder Bibliothek falsch sein könnte, wenn dieser Fehler auftritt: Das passiert normalerweise, wenn ein Header enthalten ist, der die Vorwärtsdeklaration enthält, aber noch keine vollständige Definition gefunden wurde. Die Lösung liegt auf der Hand: Fügen Sie auch den Header hinzu, der Ihnen Zugriff auf den vollständigen Typ gibt. Manchmal haben Sie auch einfach keinen oder den falschen Namensraum für einen Typ verwendet und müssen diesen stattdessen korrigieren.

  • Tatsächlich kommt es in meinem Fall aus einer PCL-Bibliotheks-Header-Datei . Da es sich um eine Bibliotheksdatei handelt, sollte die Datei als solche keinen Fehler enthalten. Es sollte etwas anderes geben, das diesen Fehler verursacht.

    – Nikal

    7. Juli 2017 um 5:50 Uhr


  • passiert es, wenn die Header-Dateien im Projekt enthalten sind, aber die Bibliothek nicht verknüpft ist???

    – Nikal

    7. Juli 2017 um 6:17 Uhr

  • Nein, das Kompilieren und Verlinken sind zwei verschiedene Schritte. Zuerst muss der Compiler Objektcode erstellen (und muss dafür alle verwendeten Typen kennen), dann verknüpft der Linker sie alle miteinander zu den endgültigen Binärdateien.

    – Mike Lischke

    7. Juli 2017 um 8:18 Uhr


  • Vielen Dank. Die Bearbeitung war sehr nützlich. Ich habe die Datei mit der vollständigen Definition eingefügt, bevor ich den Header eingefügt habe. Das hat funktioniert.

    – Nikal

    7. Juli 2017 um 9:10 Uhr

Dies geschieht, wenn wir versuchen, eine Klasse/ein Objekt oder seine Methoden zu verwenden, und diese noch nicht definiert wurden. Zum Beispiel

class A;
class B {
    class A obj;
}

oder

class A;
class B {
    class A *obj;
    B() {   
           obj->some_method();
        }

Um dies zu lösen, muss A zuerst definiert werden oder seine vollständige Deklaration muss angegeben werden (am besten in einer Header-Datei) und alle Methoden beider Klassen sollten später definiert werden (am besten in einer anderen Datei). ).

class A {
    //definition
}
class B {
class A obj;
}

In meinem Fall lag es an mangelnder Kenntnis der Vorlagen. Ich habe eine Klasse zwischen einer Vorlagendefinition und der Funktion deklariert, die dieser Vorlage zugeordnet ist.

template<typename T>
class
{
  foo a;
  foo b;
};
function(T a,int b)
{

 . . . . .

}

Und dies verursachte Probleme, da die Vorlagendefinition mit der Klasse verknüpft ist, in diesem Fall kommt ein Fehler in der Parameterliste der Funktion, die T is not defined und auch das incomplete type is not allowed. Wenn Sie eine Vorlage für mehrere Entitäten verwenden müssen, müssen Sie diese Anweisung vor der Definition dieser Entitäten wiederverwenden:

template<typename T>

Dies geschieht auch, wenn Sie die Vorwärtsdeklaration mit verwenden std::unique_ptr (z. B. um das PIMPL-Idiom zu implementieren) in Ihrer Klasse mit einem Standarddestruktor, was zu einem solchen Problem führt.

Es ist hier gut erklärt: Forward-Deklaration mit unique_ptr?

1018890cookie-checkWann tritt ein unvollständiger Typfehler in C++ auf

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

Privacy policy