Прошло много лет с тех пор, как я много занимался C ++, но я думаю, что вы столкнулись с проблемой отдельной компиляции. Шаблоны создаются при компиляции, а не при компоновке.
Поэтому, когда вы делаете вызов функции foo (), вы на самом деле не создаете экземпляр шаблона в том смысле, что не создается новый код функции, вы просто создаете символ, который должен разрешить компоновщик.
Однако, когда второй файл скомпилирован, у него есть только шаблон, и он никогда не создается, поэтому не создается версия foo (), которая фактически имеет дело с int. В результате, когда вы связываете все вместе, вы получаете ошибку.
Я не уверен на 100%, что с этим делать, но я подозреваю, что вам нужно было бы принудительно создать экземпляр функции foo () с int в этом втором файле (при условии, что это C ++).
Я работал только с шаблонами классов, а не шаблонами функций, я уверен, что кто-то здесь даст вам точный код за несколько ...