Создание нескольких шаблонов - PullRequest
0 голосов
/ 06 февраля 2012

Я проектирую библиотеку 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) /**/

потому что пользователю не нужно беспокоиться о существовании этих функций, и я хотел бы специализировать их список в зависимости от того, какой класс он / она собирается использовать. И последнее, но не менее важное: я не нашел ничего об «условной специализации» шаблона. Что я могу сделать, чтобы решить? Спасибо всем, было бы так приятно ответить. До свидания.

1 Ответ

1 голос
/ 07 февраля 2012

Это для кода хоста или кода устройства?Я считаю, что CUDA не поддерживает связывание кода устройства.Связывание шаблонных функций в хост-коде всегда было немного подозрительно, CUDA или нет CUDA.

Вместо того, чтобы грязные руки макроса - как насчет того, чтобы поместить их в заголовок внутри namespace detail?По соглашению, пространство имен detail указывает на внутреннее содержимое библиотеки, к которому вы никогда не должны обращаться как пользователь.

...