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.

InformationsquelleAutor dubnde | 2010-08-10
Schreibe einen Kommentar