Frage

Ist es möglich, eine unreine Vorlage in C ++ zu schreiben? Das heißt, eine Vorlage, die manchmal einem anderen resultierenden Typen oder int für die gleichen Template-Parameter geben. Zum Beispiel ist es möglich, eine Vorlage Foo<T> zu schreiben, wo Foo<int>::type manchmal char ist und zu anderen Zeiten float? Oder eine Vorlage Foo<T> wo Foo<double>::my_static_const_int ist manchmal 10 und andere mal 20?

War es hilfreich?

Lösung

Es ist nicht möglich. Wenn Sie eine Vorlage haben, dass verhält sich die Art und Weise, den ODR und / oder andere Regeln verletzt, wie dass eine Spezialisierung erklärt werden sollte, bevor es instanziiert werden würde. So können Sie nicht nur eine Spezialisierung setzen, die irgendwie ein typedef Mitglied ändern würden, um es für alle folgenden Verweise auf eine andere Art zu machen zu lösen.

Beachten Sie, dass Foo<T> Referenzen eine Klasse, wenn Foo eine Klassenvorlage ist. Wenn die typedef Mitglied der Klasse definiert ein Typ an einem Punkt im Programm zu sein, und ein andere Art an einer anderen Stelle, dann muss etwas schief gegangen ist. Hier sind verschiedene Standard-Zitate, die Anliegen dieser


  

Eine Spezialisierung für eine Funktionsschablone, eine Elementfunktion Vorlage oder eine Elementfunktion oder statischer Daten Mitglied einer Klasse Vorlage kann mehrere Punkte von Instanziierungen innerhalb einer Übersetzungseinheit hat. Eine Spezialisierung für eine Klasse Vorlage hat höchstens einen Punkt der Instanziierung innerhalb einer Übersetzungseinheit. Eine Spezialisierung für jede Vorlage kann Punkte Instanziierung in mehreren Übersetzungseinheiten haben. Wenn zwei verschiedene Punkte der Instanziierung gibt einem Template-Spezialisierung unterschiedliche Bedeutung gemäß der Definition einer Regel (3.2), wird das Programm schlecht ausgebildet ist, keine Diagnose erforderlich.


  

Wenn eine Vorlage, ein Mitglied Vorlage oder das Mitglied einer Klassenvorlage ist explizit spezialisiert dann der Spezialisierung wird vor der ersten Verwendung dieser Spezialisierung erklärt werden, die eine implizite Instanziierung verursachen würde stattfinden soll, in jeder Übersetzungseinheit, in denen solche Verwendung auftritt; keine Diagnose erforderlich ist.


(Verschiedene "Rauschen" übersprungen)

  

[.. Verschiedene Einheiten, die mehr im gesamten Programm definiert werden können ..]. Bei einer solchen benannte Einheit D in mehr als einer Übersetzungseinheit definiert, dann

     
      
  • jede Definition von D setzt sich aus der gleichen Folge von Token bestehen;
  •   
  • in jeder Definition von D, entsprechende Namen, nachgeschlagen nach 3,4, wird auf eine Entität bezieht innerhalb der Definition von D definiert ist, oder auf die gleiche Entität beziehen soll, nach der Überladungsauflösung (13.3) und nach dem Abgleich von Teilvorlage Spezialisierung (14.8.3) ...
  •   
  • Wenn D ist eine Vorlage, und ist in mehr als eine Übersetzungseinheit definiert, dann die letzten vier   Anforderungen aus der obigen Liste werden auf Namen aus der Vorlage umschließenden Umfang gelten in der Template-Definition (14.6.3) und auch abhängig Namen an der Stelle der Instanziierung (14.6.2) verwendet. Wenn die Definitionen von D erfüllen alle diese Anforderungen, so ist das Programm so verhalten, als ob es eine einheitliche Definition von D. waren Wenn die Definitionen von D diese Anforderungen nicht erfüllen, dann ist das Verhalten nicht definiert.
  •   
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top