2013-04-08 48 views
1

不同我有一个像下面模板运行的版本,从调试

template<typename T> 
inline void UnusedParameter(T const&) 
{ 

} 

class Client 
{ 
public: 
    template<class T> 
    void runFFT(T *wSamples, float const &fMult) 
    { 
    std::cout << "INSIDE RUNFFT : : :" << std::endl; 
    UnusedParameter(wSamples); 
    UnusedParameter(fMult); 
    } 
}; 

在我CPP的对象,我有以下:

#include "object.hpp" 

template<> 
void Client::runFFT<int16_t>(int16_t *wSamples, float const &fMult) 
{ 
    std::cout << "INSIDE INT16_T version: : :" << std::endl; 
    UnusedParameter(wSamples); 
    UnusedParameter(fMult); 
} 

template<> 
void Client::runFFT<Ipp32f>(Ipp32f *wSamples, float const &fMult) 
{ 
    std::cout << "INSIDE IPP32F version: : :" << std::endl; 
    UnusedParameter(wSamples); 
    UnusedParameter(fMult); 
} 

这两种实现上运行,而不在我的调试代码中的任何问题。它进入int16_t版本没有问题,Ipp32f版本也没有问题。

但是,当我尝试运行版本,它只进入模板,就像编译器只编译标题中的模板实现。

如何防止发生这种情况?我应该删除这个,只是创建两种不同的方法?我喜欢我的模板,但这些海森堡错误令人沮丧。

感谢您的任何意见。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

安迪警车回答了这个问题,并就解决了在HPP中执行以下操作:

template<typename T> 
inline void UnusedParameter(T const&) 
{ 

} 

class Client 
{ 
public: 
    template<class T> 
    void runFFT(T *, float const &) 
    { 
    // Thanks for Joachim for removing my Unused Parameter crap 
    std::cout << "INSIDE RUNFFT : : :" << std::endl; 
    } 
}; 

template<> 
void Client::runFFT<int16_t>(int16_t *wSamples, float const &fMult); 

template<> 
void Client::runFFT<Ipp32f>(Ipp32f *wSamples, float const &fMult); 

现在它在运行时也起作用。 CPP保持不变。

+2

一个小提示:如果你不想要“未使用的参数”警告,只声明类型而不是名称。像'void runFFT(T *,float const&)' – 2013-04-08 17:45:02

+0

'AnalyzerClient'是'Client'的子类吗? – 2013-04-08 17:46:03

+1

至于你的问题,调试器通常会清除所有变量,甚至局部变量。这意味着你可能有一个'NULL'检查在调试器中成功,但是当你没有在调试器中运行时会失败。要解决这个问题,请确保正确初始化所有变量,例如设置指针为'0'(或'NULL'或'nullptr')。 – 2013-04-08 17:47:59

回答

3

的问题是最有可能在你降级你的成员函数runFFT()的专长在单独.cpp文件int16_tIpp32f无主模板后,提供相应的声明的事实,所以编译器在实例化点(这可能属于另一个翻译单元,只有包含Client的定义的头文件)不知道这些显式专业化的存在。

将一个声明对于那些专业为包含类模板的定义相同的头文件:在C++ 11标准的

template<typename T> 
inline void UnusedParameter(T const&) { } 

class Client 
{ 
public: 
    template<class T> 
    void runFFT(T *wSamples, float const &fMult) 
    { 
     std::cout << "INSIDE RUNFFT : : :" << std::endl; 
     UnusedParameter(wSamples); 
     UnusedParameter(fMult); 
    } 
}; 

// DECLARE YOUR EXPLICIT SPECIALIZATIONS HERE 

template<> 
void Client::runFFT<int16_t>(int16_t *wSamples, float const &fMult); 

template<> 
void Client::runFFT<Ipp32f>(Ipp32f *wSamples, float const &fMult); 

每款14.7.3/6:

如果一个模板,一个成员模板或类模板的成员是明确专门那么专业化 应月在该专业化的第一次使用之前产生,这将导致在发生这种使用的每个翻译单元中发生 的隐含实例; 不需要诊断。 [...]

的“没有诊断需要”的一部分意味着如果你不遵循这个规则,你的程序将是病态的,但不要求你的编译器/连接器告诉您。这通常会导致您正在观察的那种未定义的行为。

+0

不,这会给出“void Client :: runFFT (float *,float const&)”的多重定义错误。模板专门化进入CPP文件。用GCC编译4.3.3 – Claudiordgz 2013-04-08 17:56:20

+1

@Claudiordgz:对不起,对不起。我的意思是写“为这些专业做出声明”。如果你不这样做,编译器将不会意识到它们的存在 – 2013-04-08 18:01:25

+0

你真棒Andry Prowl。非常感谢你。 – Claudiordgz 2013-04-08 18:05:47

相关问题