Явная специализация шаблонов функций вызывает ошибку компоновщика

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, даже если они не используются?

Ответы на вопрос(2)

Ваш ответ на вопрос