Здравствуйте, rg45, Вы писали:
R>Если собрать этот проект под msvc, то будет работать в точности как ты хочешь. Но потом кто-то решает, что нужно перенести определение основного шаблона функции f из separate.cpp в header.h. При этом специализация f<int> остается в separate.cpp и в точке использования в fi по-прежнему не видна. Должно измениться поведение программы после такого перенесения или нет?
Так много вариантов есть всё переломать. Это один из них. Тут ситуация я так понял проще.
template<class T>void f(T); // заявляем что есть скоро будетет такой дефолтный метод
inline void fi(int x) { f(x); } // используем дефолтную реализацию f<int> пофиг что её пока нет, вруг ниже есть
template<class T>void f(T) {} // и тут фигакс вот он. теперь ок. но если мы его не объявим ... то ub (ну вы вкурсе програмист сам дурак по стандарту во всех спорных ситуациях)
Проблемма в том что дефолтный f(T) может быть определён позже и отсюда вся эта лажа и вытекает.