Согласно спецификациям, шаблон вашей специализированной функции никогда не должен вызываться за пределами fileA.C
, если только вы не export
определение шаблона, которое в настоящее время не поддерживается ни одним компилятором (кроме Comeau) (или не запланировано на обозримое будущее).
С другой стороны, после создания экземпляра шаблона функции для компилятора становится видимой функция, которая больше не является шаблоном. GCC может повторно использовать это определение в разных блоках компилятора, поскольку стандарт гласит, что каждый шаблон должен создаваться только один раз для данного набора аргументов типа [temp.spec]. Тем не менее, поскольку шаблон не экспортируется, это должно быть ограничено модулем компиляции.
Я полагаю, что GCC может выставить здесь ошибку при обмене списком созданных экземпляров шаблонов между модулями компиляции. Как правило, это разумная оптимизация, но она должна учитывать специализацию функций, что, по-видимому, происходит неправильно.