Betrachten Sie die folgende C ++ 11-Anwendung:
A.cpp:
%Vor%B.cpp:
%Vor%Haupt.cpp:
%Vor%Obwohl es kompiliert wird (solange A und B in separaten TUs sind), sieht es nicht richtig aus, und ich habe Schwierigkeiten herauszufinden, warum.
Daher meine Frage: Verstößt dies gegen ODR, Überladung oder irgendeine andere Regel, und wenn ja, welche Abschnitte von der Standard wird verletzt und warum?
Dies ist eine ODR-Verletzung. Vorlagennamen haben eine Verknüpfung . Und beide Template-Namen haben eine externe Verknüpfung, wie [basic.link] / 4 sagt:
Ein unbenannter Namespace oder ein Namespace, der direkt oder indirekt deklariert wird innerhalb eines unbenannten Namensraums hat interne Verknüpfung. Alle anderen Namespaces externe Verbindung haben. Ein Name mit einem Namespace-Bereich, der nicht angegeben wurde Die oben angegebene interne Verknüpfung hat die gleiche Verknüpfung wie die einschließende Namensraum, wenn es der Name von
ist
- [...]
- eine Vorlage.
Und weil beide Vorlagen einen Namen teilen, bedeutet das, dass [ basic.def.odr] / 5 gilt:
Es kann mehr als eine Definition einer [...] Klassenvorlage geben (Klausel [temp]) [...] in einem Programm zur Verfügung gestellt, dass jede Definition erscheint in einer anderen Übersetzungseinheit und lieferte die Definitionen erfüllen die folgenden Anforderungen. Gegeben eine solche Entität mit dem Namen D definiert in mehr als einer Übersetzungseinheit, dann
- Jede Definition von D soll aus derselben Folge von Token bestehen; und
- [...]
Wenn D eine Vorlage ist und in mehr als einer Übersetzungseinheit definiert ist, dann gelten die vorstehenden Anforderungen sowohl für Namen aus der Der umschließende Bereich der Vorlage wird in der Vorlagendefinition verwendet ([temp.nondep]), und auch zu abhängigen Namen an der Stelle von Instanziierung ([temp.dep]). Wenn die Definitionen von D alle diese erfüllen Anforderungen, dann muss sich das Programm so verhalten, als ob es einen einzigen gab Definition von D. Wenn die Definitionen von D diese nicht erfüllen Anforderungen, dann ist das Verhalten nicht definiert.
Nicht die gleiche Abfolge von Token mit einem Abstand.
Sie können es leicht lösen, wie Jarod42 vorgeschlagen hat, indem Sie beide Definitionen der Vorlagen in einen unbenannten Namensraum stellen ihnen interne Verbindung geben.
Tags und Links c++ c++11 language-lawyer