¿Por qué la "plantilla externa" no funciona con shared_ptr?

Tuve la (aparentemente) brillante idea de usarextern template class std::shared_ptr<SomeWidelyUsedClass> en stdafx.h inmediatamente después#include <memory> a fin de evitarstd::shared_ptr<SomeWidelyUsedClass> de ser instanciado de forma redundante en cientos de archivos, pensando que podría colocartemplate class std::shared_ptr<SomeWidelyUsedClass> en un solo .cpp para forzar una única instanciación y, con suerte, ahorrar en tiempo de compilación / enlace. Sin embargo, el examen de los archivos .cod y .obj resultantes muestra queshared_ptr<SomeWidelyUsedClass> El código se está creando en todas partes de todos modos. Pero si uso exactamente esta misma técnica con mi propia clase de plantilla, funciona como se esperaba. ¿Hay algo especial sobreshared_ptr que impide este uso? Quizás algo en<memory> sí mismo que obliga al compilador a crear una instanciación antes de que llegue a miextern template declaración (estoy muy seguro de que no hay nada más arriba en stdafx.h que haga uso deshared_ptr)?

Para aclarar:

// 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>;

Entonces:

// 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>;

Y:

// 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());
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta