Sind mehrere Instanzen derselben Klassenvorlage mit demselben Typ in verschiedenen Kompilierungseinheiten zulässig? Was ist mit Funktionsvorlagen?
Ein Beispielcode ist wie folgt:
test.hpp
%Vor%test1.cpp
%Vor%test2.cpp
%Vor%Wenn ich
führe %Vor%kompiliert, ohne doppelte Definitionen zu beschweren.
Ich habe mich auf alte Entwürfe des Standards [1] [2] bezogen und nehme an, dass sich der Verknüpfungsteil nicht zu sehr ändert (außer für anonyme Namespaces). Die Klassenvorlage hat eine externe Verknüpfung von 3.5p4 und 14p4. Wenn das der Fall ist, würde ich erwarten, dass g ++ doppelte Definitionen von A :: out () beschweren sollte. Fehle ich hier etwas?
Was ist, wenn test.hpp stattdessen eine Funktionsvorlage ohne "static" oder "inline" definiert?
Danke.
Eine gute Möglichkeit, die Antworten auf diese Fragen in der Implementierung zu finden, ist die Verwendung von "nm". Oft sind die verstümmelten C ++ - Symbole besser lesbar, wenn Sie die Ausgabe von nm an c ++ filt übergeben.
Wenn Sie beispielsweise mit "-c" kompiliert haben, um ".o" s für jede Kompilierungseinheit zu erstellen, können Sie nm ausführen. Wenn ich das tue, sehe ich, dass die Template-Mitglieder schwache Symbole "W" -Code (auf x86 Linux) sind. Das bedeutet, dass mehrere Definitionen in Ordnung und in einer systemspezifischen Weise sind. Wenn ich eine Funktion mache, die nicht templatisiert ist, erscheint sie als "T" in den entsprechenden Objektdateien in beiden Übersetzungseinheiten. Das wird ein mehrfach definiertes Symbol verursachen.
Normalerweise werden C ++ - Vorlagen bei Bedarf instanziiert (ohne eine vollständige Instanziierung), wodurch Sie zusätzlich zum Deklarationsheader einen Header vom Typ _impl verwenden könnten.
Sie dürfen eine Membervorlage nicht wirklich als statisch definieren (das gibt einen Fehler). Sie können es als Inline definieren. In diesem Fall wird kein Symbol für die Elementvorlage mit nm angezeigt, da es inline wurde.