Frage

Betrachten Sie das folgende minimale Beispiel, das ein Problem in einem viel größeren Projekt reproduziert:

spec.h: generasacodicetagpre.

Andere.cpp: generasacodicetagpre.

spec.cpp: generasacodicetagpre.

Zusammenstellung: generasacodicetagpre.

Frage:

Warum passiert das?wird es irgendwie abgestreift?Was ist der Unterschied zwischen lib.a und direkter Objektdatei?: -)

danke!

War es hilfreich?

Lösung

von § 14.7.3p6:

Wenn eine Vorlage, eine Mitgliedsvorlage oder ein Mitglied einer Klassenvorlage explizit spezialisiert ist, dann ist , dass die Spezialisierung vor der ersten Verwendung dieser Spezialisierung deklariert wird, die eine implizite Instanziierung in jeder Übersetzungseinheit erfolgen würde in dem eine solche Verwendung auftritt ; Es ist keine Diagnose erforderlich. Wenn das Programm keine Definition für eine explizite Spezialisierung bereitstellt, und entweder wird entweder die Spezialisierung in einer Weise eingesetzt, die dazu führen würde, dass eine implizite Instantiierung der Erstellung oder das Mitglied eine virtuelle Member-Funktion ist, das Programm ist schlecht gebildet, keine Diagnose erforderlich.

Ihr Programm ist schlecht geformt, da Sie die Spezialisierung in spec.cpp verwendet haben, ohne es zuerst in dieser Übersetzungseinheit zu erklären. Oder, wie der folgende Absatz sagt:

Die Platzierung expliziter Spezialisierungserklärungen für Funktionsvorlagen, Klassenvorlagen, Mitgliedsfunktionen von Klassenvorlagen, statischen Datenmitgliedern von Klassenvorlagen, Mitgliedsklassen von Klassenvorlagen, Mitgliedsaufzählungen von Klassenvorlagen, Mitgliedsklassenvorlagen von Klassenvorlagen, Member-Funktion Schablonen von Klassenvorlagen, Mitgliedsfunktionen von Mitgliedsvorlagen von Klassenvorlagen, Mitgliedsfunktionen von Mitgliedsvorlagen von Nicht-Templat-Klassen, Mitgliedsfunktionsvorlagen der Mitgliedsklassen von Klassenschablonen usw. und der Platzierung von Teilspezialisierungserklärungen von Klassenvorlagen, Mitglied Klassenvorlagen von Nicht-Templat-Klassen, Mitgliedsklassenvorlagen von Klassenvorlagen usw., können sich auswirken, ob ein Programm gemäß der relativen Positionierung der expliziten Spezialisierungserklärungen und deren Instantiierung der Instanzierung in der oben angegebenen Übersetzungseinheit ausgewiesen ist unten.

beim Schreiben einer Spezialisierung
Seien Sie vorsichtig mit seiner Lage;
oder um es kompilieren zu lassen, ist ein solcher Prozess, um seine Selbstverbrennung zu küsten.

Was ich als den awesomest Absatz Limerick in der gesamten Norm .

Andere Tipps

Ben Voigts Antwort ist richtig, aber ich möchte es ein wenig hinzufügen.

Sie erhalten im Wesentlichen zwei verschiedene Versionen der Funktion, eines in andere, und eins in Spec.o (erzeugt von der Inline-Vorlage).Der Linker soll ein und nur eins auswählen, was die Annahme ergibt, dass sie beide identisch sind, da der Standard erforderlich ist.Im ersten Fall zieht der Linker nur eine Definition aus einer Bibliothek, wenn das Symbol noch nicht definiert ist.Da es in Spec.o definiert ist, wird die Bibliotheksdefinition nicht verwendet.

Mit der Definition in der Kopfzeile kann jede Übersetzungseinheit seine eigene Instantiierung erstellen.Somit gibt es niemals ein undefiniertes Symbol, das Ihre spezialisierte Version verweist.Dementsprechend ist die Objektdatei mit der spezialisierten Version nicht inbegriffen, wenn Sie die Bibliothek betrachten: Es definiert kein undefiniertes Symbol.Wenn die Objektdatei explizit beim Verknüpfen eingeschlossen ist, hat der Linker keine andere Wahl als einschließlich.Sie müssen jedoch alle Spezialisierungen erklären: Ohne die Erklärung hat der Compiler keinen Hinweis darauf, dass die allgemeine Version nicht anwendbar ist.Was passiert, tun diese Version, ob es verwendet wird oder nicht, also hängt also von der Art und Weise ab, wie das Symbol behandelt wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top