我在编译时收到以下错误消息。
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 :(得分:2)
你说LSMPD2构造函数是“在一个单独的cpp文件中定义的”。那是你的问题。由于该类显然是一个模板,因此必须在头文件中定义所有在外部使用的类方法,而不是单独编译的实现文件。
有关详情,请参阅此处:Why can templates only be implemented in the header file?