Warum kann nicht templates deklariert werden, die in einer Funktion?
Lesen C++ Templates: The Complete Guide und es sagt
Beachten Sie, dass Vorlagen nicht erklärt werden
in einer Funktion
Es nicht geben Erklärung und/oder Querverweise auf andere Kapitel in dem Buch oder externen Ressource.
Könnte mir jemand helfen bei der Erklärung dieses. Wahrscheinlich ist es später erklärt in dem Buch aber noch nicht da. Wenn bereits früher erklärt, ich muss es verpasst haben.
Beispiel:
int main()
{
class DummyClass // This compiles ok
{
int object;
};
template <typename T> // compile error "expected primary-expression before "template""
class DummyTemplate
{
T object;
};
return 0;
}
Verstehe ich nicht die Fehlermeldung von gcc entweder. Die Fehlermeldung sagt:
expected primary-expression before "template"
- Sie können nicht erklären, neue Klassen entweder, das ist einfach so wie es ist, denke ich.
- Darauf gibt es mehrere Antworten, die im Grunde sagen, "Sie können nicht, weil Sie nicht". Weiß jemand, ob es einen guten Grund, um zu verhindern, dass dies zu tun?
- Template-Argumente müssen haben externe Bindung. Warum ist dies eine Notwendigkeit gibt es einige Hinweise zur Verfügung gestellt von Greg Comeau in diesem c.l.c++.moderierte Diskussion @ groups.google.com/group/comp.lang.c++.moderiert/browse_thread/...
- das ist, warum der Unterricht an der Funktion scope kann nicht sein template Argumente, warum nicht-template-Deklarationen können nicht im Funktionsumfang.
- Seymour: Wenn Sie wissen, den genauen Grund, warum Sie nicht einfach uns aufklären 🙂
- Ich weiß nicht, und ich möchte - das ist, warum ich fragte.
- ok. Etwas gefunden in ISO/IEC 14882:2003(E). Abschnitt 14 #4 "Einen Namen für die Vorlage hat linkage (3.5). Eine nicht-member-Funktion Vorlage, können interne Verlinkung; alle anderen template Namen haben externe Bindung" Dieser Bande mit Prasoon Saurav Antwort.
- Ich denke, die genaue Antwort auf diese Frage kann nur die sein, die von Standard Typ(s). Jemand da draußen?
- das ist ein Schritt näher an einen Grund, jetzt die Frage ist, warum müssen alle Vorlagen haben ein Gestänge?
- Ich denke es hat mehr damit zu tun, wie die template-Unterstützung ist implemenented durch den Compiler. Als in C++03 war es gedacht als zu schwierig zu verwalten, Vorlagen, die keine Verknüpfung zwar wird diese Einschränkung entfernt, die in C++0X. Sehen Sie einen Ausschnitt aus Sun ' s compiler-Hinweise :- 7.3.1 Statische Instanzen @ docs.sun.com/source/819-3690/Compiling_Templates.html
- der C++0x-Entwurf noch erlaubt nur die Vorlage Erklärungen auf Namespaces oder Klassen-Gültigkeitsbereich (auch wenn es, entfernen Sie die Beschränkung auf die template-Argumente).
- warum würden Sie sogar erwägen, so etwas zu tun?
- Die Vorlage könnte eine function-Objekt, das nur in dieser einen Funktion. Ich wünschte, ich könnte diese lokale.
- in der aktuellen Norm, Sie würde nicht erlaubt werden, zu verwenden, dass die Vorlage überall, da Sie nicht übergeben werden Klassen definiert, die innerhalb einer Funktion zu anderen Vorlagen, so dass die tatsächliche Verwendung für die Vorlage wäre sehr begrenzt. Könnten Sie noch erstellen Sie eine Instanz der Vorlage und verwenden Sie es...
- In C++03 Sie kann nicht instanziiert werden Vorlagen mit lokalen Typen. Allerdings können Sie diese Art mit nicht Vorlagen. (Zum Beispiel könnte es eine Ableitung von einem polymorphe Basisklasse, und könnten Sie Instanzen aufrufen von Funktionen, die unter Verweise/Zeiger auf die Basisklasse.)
- du hast Recht... ich bin immer mehr und mehr verwendet, um statische Polymorphie und etwas weniger dynamischen Polymorphismus.
- Schade, dass die eigentliche Antwort ist hier in der geschlossenen Frage, die zwar nicht in die einer, der ist geschlossen, wie ein dupe. Vielleicht sollten wir Zusammenführen in die andere, so dass James' Antwort würde zumindest dort erscheinen?
- Ich denke, lokale Vorlage-Aliase verwendet werden könnten, zu verringern, boilerplate in einigen Funktions-templates, es wäre wirklich toll, wenn diese Einschränkung wird aufgehoben, zumindest für Aliase.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es bedeutet, dass Sie etwas nicht tun können, wie die folgenden
Vorlage Erklärungen sind nur zulässig im globalen namespace oder eine Klasse Anwendungsbereich. 🙂
Es ist nicht zulässig, da die Norm so sagt .
ISO-C++-98 (Abschnitt 14.2)
Macht das Sinn?
What is the reasoning behind it?
. Ich weiß nicht viel Formalitäten betreffend die Umsetzung von template-Deklaration innerhalb einer Funktion aber ist es nicht erlaubt, von der standard. ISO-C++ (14.2) sagtA *template declaration* can appear only as a namespace or class scope declaration
🙂Liegt das problem wahrscheinlich im Zusammenhang mit der historischen Vorlagen, wurden umgesetzt: die baldige Umsetzung der Techniken (und einige noch heute verwendet werden) verlangen, dass alle Symbole in einer Vorlage haben externe Bindung. (Instanziierung erfolgt durch die Generierung der entsprechende code in einer separaten Datei.) Und die Namen definiert, die innerhalb einer Funktion nie Verknüpfung, und kann nicht bezeichnet werden, außerhalb des Geltungsbereichs, in dem Sie definiert wurden.
Die kurze Antwort, warum dies ist, weil, dass, wie die Jungs, die schrieb die c/c++ - Compiler und-standards wollte es zu sein. Vorlagen innerhalb von Funktionen haben müssen, wurde als zu chaotisch und/oder schwierig zu verstehen oder zu analysieren, so dass Sie es Verbot.
Die Antwort "weil die Norm so sagt", ist natürlich richtig, aber wir betrachten die generische lambdas.
In C++14 und C++17 generische lambdas sind die einzige Art des Schreibens, die Vorlage-wie code, die ich kenne:
Technisch können Sie schreiben, jede Art von template-code einfach mit. Obwohl Sie hart arbeiten müssen, um die Arbeit rund um die verschiedenen Einschränkungen dieses Ansatzes.
Werden einfacher in C++20 wenn. Mit template-parameter-Liste im generischen lambdas Sie werden in der Lage sein, code zu schreiben, wie diese:
GCC schon unterstützt diese syntax.
Das einzige mal, das nützlich sein würde, wenn Sie erstellt mehrere Instanzen der Vorlage mit unterschiedlichen Typen innerhalb der einen Funktion. Bewegen Sie Ihre private Klassen aus Ihren Funktionen sowieso. Wenn das beginnt zu Krempel in Ihre Klassen, dann sind Sie zu groß und müssen umgestaltet werden.
Meine Vermutung ist, dass es schwer ist zu implementieren, das ist, warum es nicht erlaubt ist (in Standard C++03). Schreiben von Klassen-templates außerhalb von Funktionen ist eine akzeptable Lösung von der anderen Seite.
[](auto x) {}
hat die Vorlageoperator()
, es funktioniert einfach nicht-template-Parameter namens.Was genau wäre der nutzen? So können Sie erklären, template-Variablen, die nur innerhalb der Funktion? Ist das wirklich sinnvoll?
template<typename T> struct ComparatorTemplate { using type = T; };
oder spezialisierte Varianten, wie erforderlich, innerhalb der Funktion selbst, also das verstecken von außen code.char
, ohne Fehler, könnte es die Spezialisierungentemplate<> struct ComparatorTemplate<signed char> { using type = char; };
undtemplate<> struct ComparatorTemplate<unsigned char> { using type = char; };
, so dass Sie mit einem check wiestd::is_same<char, typename ComparatorTemplate<TypeToCheck>::type>
. Während die Spezialisierungen könnte gemacht werden, die außerhalb der definition einer Funktion, würde Sie nur belasten mit namespace, wenn kein anderer code benötigt Sie.