2013-08-22 109 views
0

是否可以将模板参数传递给其他地方定义的函数? 比如我有类将模板类参数传递给外部函数

Barrier.pp

template<Location L, Knock K> 
class Barrier 
{ 
    //... 
    void checkBarrier(...) 
    { 
    BarrierBest_checkBarrier<L, K>(...); 
    } 
    //... 
} 

Other.cpp

template<Location L, Knock K> 
BarrierBest_checkBarrier(...) 
{ 
    //Use L and K to do call other function 
} 

正如我有它现在编译器会引发一个解析的外部符号的所有模板参数的可能组合,即BarrierBest_checkBarrier<1,1>,BarrierBest_checkBarrier<1,0>,BarrierBest_checkBarrier<0,1>,BarrierBest_checkBarrier<0,0>

有没有办法让这项工作?

+0

需要在多个翻译单元(cpp文件)中可见的模板必须在头文件中定义并包含在两者中。 – metal

+0

请提供能够产生与您的问题相同的错误的代码。 – Oswald

回答

0

问题可能是您的模板化功能在cpp文件中,而不是标题中。模板参数必须在编译时已知。如果你有单独的编译单元,它们不是。

+0

我已经在一个单独的头文件中定义了函数,并将它包含在两个文件中,但仍然得到相同的消息。 BarrierBest_checkBarrier函数不是任何类的一部分,只是帮助我将一个调用包装到其他东西(CUDA内核)的一种方法。顺便说一句,可能是一个愚蠢的问题,但更好地问,如果头文件有扩展名“.cuh”是否有问题 – BRabbit27

+0

不同的头扩展应该没有问题。整个定义在标题中,而不仅仅是声明? –

+0

在阅读了很多次提供的答案后,我明白可能是什么问题。我会试试看。 – BRabbit27

2

如果组合的数量有限,则可以明确地实例化模板,以便让代码在头文件和源文件之间分开。

如果你想其他文件调用你的函数来接自己的参数不在这个列表将这个在你的源文件

template void BarrierBest_checkBarrier<0, 0>(...); 
template void BarrierBest_checkBarrier<0, 1>(...); 
template void BarrierBest_checkBarrier<1, 0>(...); 
template void BarrierBest_checkBarrier<1, 1>(...); 

的底部,你必须把整个模板代码到一个头文件。

+0

在源文件中,你的意思是.hpp或.cpp?如果BarrierBest_checkBarrier不是任何类的一部分呢? – BRabbit27

+0

源文件= .cpp糟糕我没有注意到BarrierBest_checkBarrier不是该类的一部分。我会更新我的答案。 –

+0

我一直在努力使它工作,但我得到了'没有实例模板'BarrierBest_checkBarrier *匹配指定的类型' – BRabbit27

相关问题