(Вы должны очистить свой синтаксис. Я предполагаю, что фактический код не все эти синтаксические ошибки.)
Явная специализация функции шаблона больше не шаблон, так как он не зависит от какой-либо параметры шаблона. С точки зрения Единого правила определения (ODR) это «обычная» функция. И как «обычная» функция, она должна быть объявлена в заголовочном файле, а определен только один раз в некотором файле реализации. По-видимому, вы определили свою специализацию в файле заголовка, что приводит к нарушению ODR, если заголовочный файл включен в несколько единиц перевода (например, ошибки «множественного определения»).
В вашем примере template<> void A<int>::AFnc()
(я добавил void
в качестве типа возврата) больше не является шаблоном. Это означает, что это определение
template<> void A<int>::AFnc() { }
должны быть перемещены из заголовочного файла в какой-то файл реализации. Между тем, в заголовочном файле вы должны держать, не определяющую декларацию для этой функции
template<> void A<int>::AFnc(); // <- note, no function body
, чтобы позволить компилятору знать, что такая специализация существует.
В общем, помните о простом правиле: если ваш шаблон функции все еще зависит от некоторых параметров неопределенного шаблона, он является истинным шаблоном, и он должен быть определен в заголовочном файле. Но как только вы «исправите» все параметры (по явной специализации), это уже не шаблон. Он становится обычной функцией, которая должна быть объявлена в заголовочном файле, а определен только один раз в некотором файле реализации.
P.S. Вышеупомянутое относится к не-встроенным функциям. Встроенные функции могут быть (и, как правило, предполагается) определены в файлах заголовков.
P.P.S. Такая же логика применяется к явным специализациям статических элементов данных классов шаблонов.
Вам нужно очистить свой синтаксис.Код в это время настолько «грязный», что нет способа убедиться, что это реально или нет. Где тип возврата для функции? – AnT