多个模板实例化

时间:2012-02-06 13:57:02

标签: templates macros cuda

我正在设计一个带模板类的CUDA-C ++库。我的类使用模板函数,它们对main和用户都是不可见的。我需要明确地专门化它们,因为要执行两个编译步骤,否则我会在链接时遇到“未解决的外部”错误。作为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 个答案:

答案 0 :(得分:1)

是主机代码还是设备代码?我相信CUDA不支持链接设备代码。在主机代码中链接模板函数总是有点可疑,CUDA或没有CUDA。

而不是让你的手弄脏宏 - 如何将它们放在namespace detail内的标题中? 按照惯例,detail命名空间表示您不应该以用户身份访问的库内部资料。