Frage

Microsoft hat eine Verlängerung wobei man erklären kann, dass eine Vorlage -Instanziierung extern ist; Folglich wird es nicht implizit instanziiert. Zumindest ist das die Theorie. Ich habe versucht, das mit dem Code zu reproduzieren

#include <vector>

class Foo{
    int i;
public:
    virtual ~Foo();
};

extern template class std::vector<Foo>;

Das gibt mir

warning C4231: nonstandard extension used : 'extern' before template 
explicit instantiation

Es scheint jedoch nichts anderes zu passieren: Das Programm verknüpft weiterhin Fund, obwohl ich Push_back verwende (und Dumpbin zeigt, dass Push_back instanziiert wurde).

Nur wenn ich erkläre

extern template void std::vector<Foo>::push_back(const Foo&);

Ich erhalte wie erwartet einen Linker -Fehler.

Also: Wie kann ich die gesamte Instanziierung (alle Mitglieder) als explizit erklären und implizite Instanziierung verhindern?

War es hilfreich?

Lösung

Ich denke, Sie werden von dieser Notiz in den Dokumenten für die Erweiterung gebissen:

Das externe Schlüsselwort in der Spezialisierung gilt nur für Mitgliedsfunktionen, die außerhalb des Gremiums der Klasse definiert sind. In der Klassenerklärung definierte Funktionen gelten als Inline -Funktionen und werden immer instanziiert.

vector::push_back() (Und die meisten oder alle STD :: Vector <> Vorlage) sind in der Klassenerklärung definiert.

Angesichts dessen, was die Notiz sagt, scheint es, dass die extern Bei der Mitgliedsfunktion sollte weiterhin zu einer Instanziierung führen, wäre jedoch nicht überrascht, dass diese Erweiterung unterdokumentiert oder untergebracht ist.

Ich vermute, Sie werden nicht in der Lage sein, das zu tun, was Sie wollen, ohne das explizit zu tun extern Bei jeder Mitgliedsfunktion.

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