Ошибка компиляции специализации шаблона функции - PullRequest
17 голосов
/ 24 марта 2011
##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.

Ответы [ 2 ]

30 голосов
/ 24 марта 2011

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

12 голосов
/ 24 марта 2011

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

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

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

...