Предположим, у меня есть шаблон функции
template <typename T>
void f(T) {}
Тогда мы могли бы иметь объявление друга
friend void f<int>(int);
и явное объявление экземпляра шаблона
extern template void f<int>(int);
Эти две декларации связаны каким-то образом или полностью независимы? Если связаны, как они взаимодействуют друг с другом?
friend
Объявление не «взаимодействует» ни с чем, кроме определения функции, которая объявлена другом, которой разрешен доступ к закрытым членам класса, содержащего объявление.
Так что нет, особого взаимодействия между friend
декларация и extern template
объявление, хотя они оба ссылаются на одну и ту же функцию (в этом смысле они связаны, но я предполагаю, что вы поняли это, когда написали вопрос).
Других решений пока нет …