Функция компиляции

##A.hh

template<class T> void func(T t) {}
template<> void func<int>(int t) {}

void func2();

##A.cpp

void func2() {}

##main.cpp

func("hello");
func(int());

Ошибка, которую я получаю: ошибка LNK2005: "void __cdecl func (int)" (?? $func @H @@YAXH @Z), уже определенная в A.obj, найден один или несколько найденных множимых символов

Является ли спецификация шаблона функции не обработанной как обычный шаблон функции? Похоже, что это будет в объективном файле для A.

Ответ 1

As template<> void func<int>(int t) {} - это функция перегрузки, а не шаблон функции (т.е. все типы известны в точке определения, поэтому она больше не является шаблоном), она должна быть помечена как inline или определена в a. cpp, чтобы избежать множественных ошибок определения, как и при любом другом определении функции.

Ответ 2

Проблема заключается в следующем: полная специализация шаблонов больше не является шаблоном, она больше похожа на обычную функцию. Поэтому вы должны действовать соответственно:

  • либо поставить определение func<int>() в файл cpp

  • или сделать его встроенным