C ++ - Vorlagen und statische Elemente - Definition in der Kopfzeile

8

Betrachten Sie das folgende Konstrukt:

%Vor%

Diese Template-Klasse und die Definition der statischen Instanz werden in die gleiche Header-Datei geschrieben. Bei einer Nicht-Template-Klasse verursacht dieses einen Link-Time-Fehler, da mehrere Symbole für das statische Element der Instanz definiert sind. Es scheint intuitiv, dass dies auch mit Vorlagen geschieht, daher muss man die Definition trennen und in eine CPP-Datei schreiben. Vorlagen werden jedoch normalerweise in header-ähnlichen Dateien deklariert und definiert. Was erlaubt es, dass diese Syntax für Vorlagenklassen gültig und funktionsfähig ist?

Dort gibt es einen Link Wikipedia , der aber keine klare Erklärung dafür liefert, was bei Template-Klassen passiert .

    
teodron 31.08.2012, 11:09
quelle

1 Antwort

13

Dies funktioniert, weil [basic.def.odr]/5 explizit erlaubt hat, Vorlagen zu duplizieren:

  

Es kann mehr als eine Definition eines Klassentyps (Abschnitt 9), Aufzählungstyp (7.2), Inline-Funktion mit externer Verknüpfung (7.1.2), Klassenvorlage (Abschnitt 14), nicht statische Funktionsvorlage (14.5.) geben .6), statisches Datenelement einer Klassenvorlage (14.5.1.3), Elementfunktion einer Klassenvorlage (14.5.1.1) oder Template-Spezialisierung, für die in einem Programm einige Template-Parameter nicht angegeben sind (14.7, 14.5.5) vorausgesetzt, dass jede Definition in einer anderen Übersetzungseinheit erscheint und vorausgesetzt, dass die Definitionen die folgenden Anforderungen erfüllen. ...

Die Anforderungen sind ziemlich lang, also werde ich sie hier nicht duplizieren, aber im Wesentlichen geben sie an, dass jede doppelte Definition identisch sein muss (sonst hat das Programm ein undefiniertes Verhalten).

    
Mankarse 31.08.2012, 11:17
quelle

Tags und Links