2013-10-03 42 views
0

編譯時出現以下錯誤消息。C++具有用戶定義函數的架構x86_64的未定義符號

Undefined symbols for architecture x86_64: 
    "LSMDP2<HC_Base, HC_Base, Sine>::LSMDP2(int, int, std::unique_ptr<Forward, std::default_delete<Forward> >&, std::unique_ptr<BrownianMotionIncGenerator, std::default_delete<BrownianMotionIncGenerator> >&, std::unique_ptr<Driver, std::default_delete<Driver> >&, Sine&&, gsl_vector*, std::unique_ptr<Regression, std::default_delete<Regression> >&, std::unique_ptr<UniformSims, std::default_delete<UniformSims> >&, std::unique_ptr<TimeGrid, std::default_delete<TimeGrid> >&, HC_Base&&, HC_Base&&)", referenced from: 
     LSMDP2<HC_Base, HC_Base, Sine> make_LSMDP2<HC_Base, HC_Base, Sine>(int, int, std::unique_ptr<Forward, std::default_delete<Forward> >&, std::unique_ptr<BrownianMotionIncGenerator, std::default_delete<BrownianMotionIncGenerator> >&, std::unique_ptr<Driver, std::default_delete<Driver> >&, Sine&&, gsl_vector*, std::unique_ptr<Regression, std::default_delete<Regression> >&, std::unique_ptr<UniformSims, std::default_delete<UniformSims> >&, std::unique_ptr<TimeGrid, std::default_delete<TimeGrid> >&, HC_Base&&, HC_Base&&) in main.o 


ld: symbol(s) not found for architecture x86_64 

collect2: error: ld returned 1 exit status 

make: *** [BSDESimV2] Error 1 

其據稱未定義的符號是

template<class BasisY, class BasisZ, class Term> LSMDP2<BasisY,BasisZ,Term> make_LSMDP2(int N, int q , F_Forward_ & F , 
     BM_Inc_ & B, B_Driver_ & D, Term && Ter, gsl_vector * X0 , 
     A_Regression_& R, A_UniSims_ & M, T_Grid_ & T /*Time grid initializer*/, BasisY && BY, BasisZ && BZ){ 
return LSMDP2<BasisY,BasisZ,Term>{N, q ,F, B, D, std::forward<Term>(Ter), X0, R, M , T, std::forward<BasisY>(BY), std::forward<BasisZ>(BZ) }; 
} 

該功能被包含在其中LSMDP2類定義的頭文件。我檢查了鏈接,沒關係,並且構造函數'LSMPD2(....)'在單獨的cpp文件中定義。我已經確保不要執行通常的錯誤,比如搞砸鏈接,忘記構建cpp文件,忘記定義構造函數,或者使用gcc而不是g ++。

實際上,我嘗試了一個更簡單的例子 - 編譯時只有一個cpp文件,參數較少,但模板和unique_ptrs都在使用 - 並且工作正常。有誰知道什麼可能導致這個問題?

+0

如果您有一種情況,工作和不工作的情況下,該方法解決你的問題是,試圖打破,通過使它的作品之一更像是一個不工作的人。如果您想從SO獲得幫助,請發佈您的鏈接器命令行。 –

回答

2

你說LSMPD2構造函數是「在一個單獨的cpp文件中定義的。」那是你的問題。由於該類顯然是一個模板,因此外部使用的類的所有方法都必須在頭文件中定義,而不是單獨編譯的實現文件。

欲瞭解更多詳情,請看這裏:Why can templates only be implemented in the header file?

相關問題