Явная специализация шаблонов функций вызывает ошибку компоновщика
Functions.h:
#pragma once
#include <iostream>
template<class T> void TemplatedFunction(T* p) {}
template<> void TemplatedFunction<float>(float* p) {}
template<> void TemplatedFunction<char>(char* p) {}
Functions.cpp:
#include "Functions.h"
void Test()
{
TemplatedFunction<float>(NULL);
TemplatedFunction<char>(NULL);
}
main.cpp:
#include "Functions.h"
void Test();
int main()
{
Test();
return 0;
}
Ошибки сборки:
main.obj : error LNK2005: "void __cdecl TemplatedFunction<float>(float *)" (??$TemplatedFunction@M@@YAXPAM@Z) already defined in Functions.obj
main.obj : error LNK2005: "void __cdecl TemplatedFunction<char>(char *)" (??$TemplatedFunction@D@@YAXPAD@Z) already defined in Functions.obj
Я знаю два способа это исправить:
Не включайте Functions.h в несколько файлов .cpp - нельзя применять в сложном проекте, если h-файл содержит некоторые дополнительные определения, необходимые во многих файлах .cpp.
Объявите все шаблонные функции какstatic
, Но это означает, что специализированные функции появляются во всех файлах .cpp, в которые включен Functions.h, даже если они не используются, что, возможно, вызывает дублирование кода.
Итак, я вижу, что специализированная шаблонная функция ведет себя как не шаблонная функция. Есть ли другое решение, чтобы предотвратить ошибку компоновщика безstatic
декларация? Если функции объявленыstatic
современный C ++ компилятор удаляет их из оптимизированной сборки, если они не используются?
Редактировать. Прочитав первые два ответа: я не спрашиваю здесь, как предотвратить такую ошибку компоновщика. Предполагая, что я не могу переместить специализацию в файл .cpp и оставить его в файле .h сstatic
или жеinline
, вызывает ли это дублирование кода и вздутие живота в оптимизированной сборке, когда эти функции добавляются в каждый файл .cpp, в который включен файл .h, даже если они не используются?