Вы не должны использовать __declspec (dllexport) в заголовочных файлах, которые будет использовать код, использующий вашу DLL, так как они должны использовать __declspec (dllimport).
Поэтому вы должны создать макрос, который используетdllexport, если определенное другое определение установлено, и dllimport, если это не так.
В общем заголовке где-то:
#ifdef EXPORTING_FOO
#define FOO_API __declspec(dllexport)
#else
#define FOO_API __declspec(dllimport)
#endif
Вы можете создать экземпляр шаблона:
extern template class FOO_API Templ<MyClass, int >;
в заголовке.Обратите внимание на внешний вид здесь.В пределах одного модуля компиляции объявляйте то же самое, но без внешнего и без FOO_API, таким образом:
template class Templ<MyClass, int >;
Это будет означать, что код, использующий вашу библиотеку, не будет создавать экземпляр шаблона, а будет использовать тот, что в вашей библиотеке,Это особенно полезно, когда в шаблоне есть виртуальные члены.
Если шаблон из стандартной библиотеки или Boost, используемый вами код должен будет использовать ту же версию, что и ваша, иначе может возникнуть серьезная проблема..
Учитывая, что в вашем собственном примере он появляется в приватной области, вы предлагаете реорганизовать его из интерфейса вашей библиотеки.В идеале ваша библиотека должна предоставлять только открытые методы и члены, кроме предварительных объявлений.Частные конструкторы копирования и назначения для того, чтобы сделать класс не копируемым и не присваиваемым, хороши - они на самом деле не являются частью реализации, они являются частью интерфейса вашего класса (вы говорите, что вы не можете копировать или назначать их).