Überladen der Klassenvorlage über TUs

8

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?

    
rustyx 23.01.2018, 10:43
quelle

1 Antwort

13

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.

    
StoryTeller 23.01.2018, 11:02
quelle

Tags und Links