调用含数组与函数指针参数的force函数时出现undefined reference错误求助
问题根源与解决方法
这个链接错误的核心原因是**force函数的声明和定义签名不一致**,导致编译器将其视为两个不同的函数,链接阶段找不到声明版本的实现。
具体差异对比
- 声明中的函数指针参数:
void(*force_func)(Particle&, Particle&) - 定义中的函数指针参数:
void (*force_func)(const Particle&, const Particle&)
C++中,Particle&和const Particle&是完全不同的参数类型,这使得声明的force函数和定义的force函数被判定为两个独立的函数,链接器找不到声明版本的实现代码,因此抛出undefined reference错误。
解决步骤
统一函数签名:将声明中的函数指针参数改为与定义一致的
const Particle&,修改后的声明应为:void force(Particle(&a_p)[SIZE], void(*force_func)(const Particle&, const Particle&));(推荐此方案,因为引力子/光子这类力函数通常不需要修改粒子对象,使用
const更符合语义)验证回调函数签名:确保
float3::graviton和float3::photon的函数签名与修改后的force参数匹配,即它们的定义应为:namespace float3 { void graviton(const Particle& p1, const Particle& p2); void photon(const Particle& p1, const Particle& p2); }
如果坚持不需要const限定,也可以修改force函数的定义,去掉参数的const修饰,让声明和定义保持一致。
内容的提问来源于stack exchange,提问作者Aidan Pastonyck
相关产品推荐
相关产品推荐

