Wenn ich einen Zeiger auf eine Klasse verwenden möchte und keine Operationen darauf ausführen, können wir die Klasse deklarieren. Aber wenn das ein Typdef ist, warum ist das nicht erlaubt? Im folgenden Beispiel kompiliert es nur, dass ich den kommentierten Code einschließe, aber warum möchte der Compiler zu diesem Zeitpunkt etwas darüber wissen? Wie kann ich etwas weiterleiten, das ein typedef sein kann? Gibt es Änderungen in diesem Verhalten in C ++ 0 X?
%Vor%Ein typedef erstellt keinen Typ, sondern fügt einem vorhandenen Typ einen neuen Namen hinzu, und Sie können ihn nicht weiterleiten. Ich empfehle Ihnen, diese Antwort auf eine andere verwandte Frage zu lesen, I denke, es kann helfen, die Unterschiede zwischen einem Typedef und einer Deklaration eines benutzerdefinierten Typs zu verstehen.
Sie können andererseits den tatsächlichen Typ vorwärts deklarieren und dann den typedef an Stelle einfügen.
EDIT: Erweitern Sie Ihr spezielles Beispiel:
Nachdem die Vorlage temp
deklariert wurde, ist der Bezeichner temp
im benutzerdefinierten Typen-Bezeichnerbereich verfügbar (der sich vom übrigen Bezeichnerbereich der Symbole unterscheidet). Der typedef erstellt einen Alias im globalen Bezeichnerbereich mit dem Namen later
, also nach den kommentierten Zeilen (waren sie unkommentiert), enthält der benutzerdefinierte Bezeichnerbereich temp
, bezieht sich auf die Vorlage und der Bezeichner later
, das sich im globalen Bezeichnerraum befindet, bezieht sich auf die konkrete Instanziierung temp<int>
. (Was für ein Bissen von "Bezeichner" und "Raum"!)
Wenn Sie dagegen die Klasse deklarieren, wie in der ersten unkommentierten Zeile class later;
, fügen Sie dem benutzerdefinierten Typenbezeichnerbereich einen Bezeichner hinzu. Der Unterschied ist im folgenden Beispiel zu sehen:
Tags und Links c++ c++11 typedef forward-declaration