Если у меня есть функция шаблона в отдельной единице компиляции (которая создает объектный файл с суффиксом .o из компилятора CUDA C NVCC)
скажем, у нас есть определение (реализация)
template<typename T>
void foo(T a){
// something
}
Чтобы создать явный код в объектном файле, чтобы иметь возможность ссылаться на него из другой единицы компиляции, мне нужно явно создать экземпляр этого шаблона (для всех необходимых мне параметров шаблона):
template void foo<double>(double a);
template void foo<float>(double a);
Это приводит к фактическому коду в объектном файле.
Выполнение других вещей, таких как:
template<> void foo<double>(double a);
template<> void foo<float>(float a);
Не создает код в объектном файле, поскольку это полное специализированное объявление шаблона. Это правильно?
Также
void foo(double a);
void foo(float a);
не создает код, поскольку это было бы декларацией перегрузки ? это правильно?
Теперь возникает вопрос: каков общий синтаксис, позволяющий компилятору создавать код для шаблонной функции или класса в отдельной единице компиляции?