Почему «внешний шаблон» не работает с shared_ptr?

У меня была (на первый взгляд) блестящая идея использованияextern template class std::shared_ptr<SomeWidelyUsedClass> сразу после stdafx.h#include <memory> чтобы предотвратитьstd::shared_ptr<SomeWidelyUsedClass> от избыточного создания экземпляров в сотнях файлов, полагая, что я мог бы поместитьtemplate class std::shared_ptr<SomeWidelyUsedClass> в одном .cpp для форсирования одного экземпляра и, мы надеемся, сэкономим на времени компиляции / компоновки. Однако проверка полученных файлов .cod и .obj показывает, чтоshared_ptr<SomeWidelyUsedClass> код создается везде везде. Но если я использую ту же самую технику с моим собственным классом шаблона, она работает как положено. Есть ли что-то особенное вshared_ptr что исключает такое использование? Возможно, что-то в<memory> сам, который заставляет компилятор создать экземпляр, прежде чем он достигнет моегоextern template утверждение (я очень уверен, что в stdafx.h нет ничего выше, что используетshared_ptr)?

Чтобы уточнить:

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

Затем:

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

А также:

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

Ответы на вопрос(1)

Ваш ответ на вопрос