Warum funktioniert "extern template" nicht mit shared_ptr?

Ich hatte die (scheinbar) gute Idee, sie zu benutzenextern template class std::shared_ptr<SomeWidelyUsedClass> in stdafx.h unmittelbar danach#include <memory> um zu verhindernstd::shared_ptr<SomeWidelyUsedClass> Ich musste davon ausgehen, dass ich redundant in Hunderten von Dateien instanziiert wurde, um herauszufinden, wo ich sie platzieren konntetemplate class std::shared_ptr<SomeWidelyUsedClass> in einer einzelnen .cpp, um eine einzelne Instanziierung zu erzwingen und hoffentlich Zeit beim Kompilieren / Verknüpfen zu sparen. Die Untersuchung der resultierenden COD- und OBJ-Dateien zeigt jedoch, dassshared_ptr<SomeWidelyUsedClass> Code wird sowieso überall erstellt. Aber wenn ich genau diese Technik mit meiner eigenen Template-Klasse verwende, funktioniert es wie erwartet. Gibt es etwas Besonderesshared_ptr das schließt diese Verwendung aus? Vielleicht etwas in<memory> selbst, der den Compiler zwingt, eine Instanziierung zu erstellen, bevor er meine erreichtextern template Aussage (Ich bin mir sehr sicher, dass es in stdafx.h nichts Höheres gibt, das davon Gebrauch machtshared_ptr)?

Um klarzustellen:

// stdafx.h; included in every cpp in the project
#include <memory>
#include "SomeWidelyUsedClass.h" // no shared_ptr in here

// I expect this to prevent instantiation of std::shared_ptr<SomeWidelyUsedClass>
// in all compilation units that include this, except the one below.
extern template class std::shared_ptr<SomeWidelyUsedClass>;

Dann:

// ExplicitTemplateInstantiations.cpp
#include "stdafx.h"

// I expect this to cause std::shared_ptr<SomeWidelyUsedClass>
// to be instantiated in this compilation unit
template class std::shared_ptr<SomeWidelyUsedClass>;

Und:

// SomeOtherFile.cpp
#include "stdafx.h"
#include "SomeWidelyUsedClass.h"

void foo()
{
   // I expect that SomeOtherFile.obj will not include an instantiation of
   // std::shared_ptr<SomeWidelyUsedClass> since it was declared extern in stdafx.h
   std::shared_ptr<SomeWidelyUsedClass>(new SomeWidelyUsedClass());
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage