Ich gebe Foo nicht an die Außenwelt zurück. Es ist nur ein temporärer Typ, den ich innerhalb der Funktion verwende.Warum kann ein std :: vector keinen lokalen Typ annehmen?
Antwort
Eine lokale Klasse kann kein Template-Argument sein. Da der Standard sagt: -
14.3.1 Absatz 2: „Ein lokaler Typ, ein Typ ohne Gestänge, eine unbenannte Art oder einen Typ von einem dieser Typen zusammengesetzt wird nicht als Template-Argument verwendet werden für einen Vorlagetyp-Parameter. "
[Example:
template <class T> class X { /* ... */ };
void f()
{
struct S { /* ... */ };
X<S> x3; // error: local type used as templateargument
X<S*> x4; // error: pointer to local type used as templateargument
}
-end example] [Note: a template type argument may be an incomplete
type (3.9). ]"
Eine Abhilfe ist here auf c.l.c vorgeschlagen ++. Moderiert.
UPDATE: Es gab einige Diskussionen darüber, warum es nicht möglich ist, lokale Klassen als Vorlagenargumente zu haben? Die Links here und here auf c.std.C++ diskutieren das gleiche.
Kurze Antwort: Da die C++ Standard sagt so (Abschnitt 14.3.1
)
Lange Antwort: Zu der Zeit, C++ standardisiert war, die C++ Normenausschuss angenommen, dass es die Umsetzung und Leistung wäre Probleme. Diese Befürchtungen erwiesen sich als unbegründet und haben die Entscheidung zum endgültigen Entwurf des C++ 0x-Standards aufgehoben.
Auf praktischer Kenntnis, unterstützen einige Compiler bereits die neuen C++ 0x Regeln:
- Für MacOSX Sie gcc brauchen> = 4.5 mit dem
-std=c++0x
Befehlszeilenparameter - Für die Microsoft-Compiler müssen Sie> = vc8/VS2005 ohne die
/Za
Option (Spracherweiterungen deaktivieren)
- 1. 'vector' im Namespace 'std' nennt keinen Typ
- 2. warum Vektor einen lokalen Typ
- 3. std :: vector auf vorwärts deklarierten Typ
- 4. Warum kann ich keinen std :: stack von std :: ifstreams erstellen?
- 5. Fehler bei der Erstellung von std :: vector der lokalen Struktur
- 6. Iterate Mehrere std :: vector
- 7. Warum hat std :: vector zwei Zuweisungsoperatoren?
- 8. Warum liefert decltype für ein String-Literal keinen Array-Typ?
- 9. string in namespace std nennt keinen typ
- 10. Warum muss std :: vector :: insert kopieren?
- 11. Warum kann ich nicht std :: vector mit Listeninitialisierung initialisieren
- 12. Warum Literalwert hat keinen Typ?
- 13. std :: vector von std :: function
- 14. Warum "std :: vector <std::string> &" statt "void"?
- 15. Std :: Vector Abbruch Problem
- 16. Wie std :: vector <std :: reference_wrapper <T>> konvertieren std :: vector <T>
- 17. std :: vector Referenzen
- 18. "Benennt keinen Typ" Fehler C++
- 19. Warum ist std :: vector :: operator [] 5 bis 10 mal schneller als std :: vector :: at()?
- 20. Std :: Vector Iterator Invalidation
- 21. Vererbung von std :: vector
- 22. Eigen und std :: vector
- 23. ein std :: vector an einen QVector
- 24. Wie kann man wissen, ob ein Typ eine Spezialisierung von std :: vector ist?
- 25. Vergleichsfunktion für std :: vector von std :: arrays
- 26. push_back Ausgabe std :: vector
- 27. Konvertiere R :: vector in std :: vector
- 28. kann nicht erstellt constexpr std :: vector
- 29. Split std :: wstring in std :: vector
- 30. Wie std :: vector verkleinern?
+1 Gute Frage! Habe noch nie davon gehört =) – SadSido
@anon: Darf ich wissen, welchen Compiler Sie benutzt haben? – jasonline
@anon: Ich könnte es zwar in Visual C++ 2005 kompilieren, aber ich denke, das entspricht nicht dem Standard, wenn es dort wirklich erwähnt wird. – jasonline