我是cuda编码的新手,(并且在c ++方面没有大量经验)所以我一直在四处寻找尝试找到这个问题的解决方案,但一般都不了解人们尝试和解释的内容,并且还没有让它运作起来。
基本上,我有一个.cu文件,其中包含两件事:
template <class ModelType>
__global__ void Stepkernel(ModelType *particles)
和
template <class ModelType>
void runTest(ModelType *particles)
然后我有一个头文件,SamplerI.h,我没有写,但我试图包含对上面的void函数的调用,所以,在所有#includes下面我有:
template <class ModelType>
void runTest(ModelType *particles);
然后在标题中有一个函数,其中我已经包含了对上面的调用。
标题和相关文件在库libdnest中编译,我使用nvcc -c step.cu编译.cu文件,然后链接:
g++ -o main main.cpp step.o -ldnest
现在,如果模板不存在(即我只有一个void函数而没有提到ModelType),所有这一切都很好,它编译并运行,但是一旦我尝试包含模板,我得到以下编译错误:
../../include/SamplerImpl.h: In member function ‘bool DNest3::Sampler<ModelType>::step() [with ModelType = Banana]’:
../../include/SamplerImpl.h:121: instantiated from ‘void DNest3::Sampler<ModelType>::run() [with ModelType = Banana]’
main.cpp:37: instantiated from here
../../include/SamplerImpl.h:159: error: no matching function for call to ‘runTest(Banana*)’
并且我不知道如何尝试修复它......
有没有人有任何想法?如果我没有足够的解释让我知道,我会尝试包含更多信息,我真的不知道什么是重要的。
干杯 林德利
答案 0 :(得分:1)
您需要在同一源文件中使用模板,以便编译器对其进行实例化。
请注意,C ++ 11引入了“extern”,但并非所有编译器都支持这些。