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.
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.
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
– 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?
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