Вам не нужны никакие специальные трубы. Угловые 2 опционные поля необязательно. Вам просто нужно добавить? в вашем объекте
{{ (data | async)?.name }}
или
{{(name | async)?}}
В дополнение к другим ответам вы можете явно создавать экземпляры классов шаблонов. Это полезно только в том случае, если вы заранее знаете, какие типы могут принимать параметры шаблона. Вы создаете экземпляр шаблона со всеми этими типами в библиотеке.
Для вашего примера для компиляции просто добавьте следующее в конец shared.cpp :
// Instantiate myclass for the supported template type parameters
template class myclass<int>;
template class myclass<long>;
Это создает экземпляр шаблона с Type = int и помещает созданный код в общую библиотеку. Добавьте столько явных экземпляров, сколько вам нужно, для всех типов, которые вам нужны.
Опять же, если вы хотите иметь возможность создать экземпляр шаблона с любым произвольным параметром типа, тогда вы должны добавить определения в заголовочный файл, чтобы компилятор знал исходный код шаблона при его создании в других модулях компиляции.
Определения функций шаблона должны находиться в файлах заголовков. Переместите определения из shared.cpp в shared.h.
Итак, вы не можете скомпилировать это в общую библиотеку и затем связать с ней. Это просто так не работает.
Вам также необходимо включить реализацию классов шаблонов в файлы заголовков. Это ограничение шаблонов в C ++. Поэтому либо включите shared.cpp из основного (#include), либо просто переместите код из shared.cpp в shared.h
Компилятор должен видеть весь код шаблона, чтобы он мог сгенерировать соответствующий код для фактического типа, который вы хотите использовать. Поэтому вы должны поместить весь код в свой .h. файл.