2013-04-08 82 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

相關問題