Я проектирую библиотеку CUDA-C ++ с шаблонными классами. Есть классовые функции, которые используют мои классы, и они невидимы как для основного, так и для пользователя. Мне нужно явно специализировать их из-за того, что нужно выполнить два шага компиляции, в противном случае я получу «неразрешенную внешнюю» ошибку при компоновке. Поскольку эти классы используются в main.cpp, нет никакого способа (я думаю ...) сообщить nvcc, какие типы будут использоваться в основной программе, поэтому я подумал об использовании некоторых макросов для их специализации. Вот упрощенная версия кода:
//CUDA_functions.h
// CUDA functions declared here and included in files that will be compiled
// with g++. Those functions are implemented in .cu files, compiled with nvcc
template <typename T>
void foo1(T x);
template <typename T>
void foo2(T x);
template <typename T>
void foo3(T x);
//fileA.h - included in main.cpp
#include "CUDA_functions.h"
template <typename T>
class A {
// it uses foo1 & foo2 inside
}
//fileB.h - included in main.cpp
#include "CUDA_functions.h"
template <typename T>
class B {
// it uses foo1 & foo3 inside
}
//macros.h
#define _USE_CLASS_A(T) template void foo1(T); \
template void foo2(T); /**/
#define _USE_CLASS_B(T) template void foo1(T); \
template void foo3(T); /**/
//user_spec.cu - template specializations by user. This is the first file to be
// - compiled and it doesn't know what classes are going to be used
// say, user wants to use classes A & B: HERE THE ERROR RAISES!
#include "macros.h"
_USE_CLASS_A( int );
_USE_CLASS_B( int );
Когда я компилирую этот код в Visual Studio, я получаю предупреждение о двойном явном создании (foo1), но когда я компилирую его с помощью g ++, предупреждение становится ошибкой!
Я не могу писать макросы типа
#define _USE_FOO1(T) template void foo1(T) /**/
#define _USE_FOO2(T) template void foo2(T) /**/
#define _USE_FOO3(T) template void foo3(T) /**/
потому что пользователю не нужно беспокоиться о существовании этих функций, и я хотел бы специализировать их список в зависимости от того, какой класс он / она собирается использовать. И последнее, но не менее важное: я не нашел ничего об «условной специализации» шаблона. Что я могу сделать, чтобы решить? Спасибо всем, было бы так приятно ответить. До свидания.