Вы могли видеть, соблюдает ли Clang внешнюю связь для явных экземпляров шаблона.Это может относиться к не шаблонам, но в противном случае вы могли бы «заставить его работать» для шаблонов.
Простой краткий обзор:
lib1.h
template <typename T=int>
struct ATemplate { T f() { return 123; } };
добавитьfile lib1_instantiate.cpp
#include "lib1.h"
template struct ATemplate<int>;
template struct ATemplate<unsigned int>;
template struct ATemplate<long>; // etc.
Это должно создать экземпляр именованных шаблонов с внешней связью .
Если вы застряли сшаблонный класс, и вышеприведенный трюк для этого не работает, вы можете обернуть его так:
instantiate.cpp:
namespace hidden_details
{
template <class libtype> struct instantiator : public libtype
// derives... just do something that requires a complete type (not a forward!)
{ };
}
template struct hidden_details::instantiator<A>;
Если вы вышлиудачи вам придется «использовать» встроенных членов для них, чтобы получить внешнюю связь.Обычный прием - использовать адреса этих членов (вам не нужно реализовывать делегирование):
instantiate.cpp:
static void force_use_A()
{
void* unused = (void*) &A::f;
}
Однако
- преобразование в (void *) вызывает неопределенное поведение (вы не можете скомпилировать это с -pedantic -Werror на gcc)
- для перегрузок, вам нужно будет указать некрасивые броски для устранения неоднозначностиих
HTH