Fortran编译出现Ambiguous reference函数模糊引用错误如何解决
编译模糊引用问题解决方案
该问题是Fortran同名公有过程导入同一作用域后的典型命名冲突,可通过以下方案解决:
- 方案1:为LIST_T模块添加通用接口封装(最符合你简化调用的初始需求)
不要直接在LIST_T中导入两个子模块的所有内容,而是在LIST_T内针对AddItem、SetP等同名过程定义通用接口块,根据传入参数的类型(双精度/整数)自动匹配对应子模块的具体实现,示例代码如下:
调整后外部引用LIST_T时,调用module LIST_T use LIST_DP_T, only: & AddItem_dp => AddItem, & SetP_dp => SetP, & LIST_DP_T use LIST_INT_T, only: & AddItem_int => AddItem, & SetP_int => SetP, & LIST_INT_T implicit none private ! 将导入的重命名过程默认设为私有 ! 对外暴露公共接口 public :: AddItem, SetP, LIST_DP_T, LIST_INT_T interface AddItem module procedure AddItem_dp, AddItem_int end interface interface SetP module procedure SetP_dp, SetP_int end interface end module LIST_TAddItem会自动根据参数类型匹配对应实现,不会出现命名冲突。 - 方案2:引用时重命名或指定导入内容
如果不想修改LIST_T模块,可在Profile_Driver_Input模块引用LIST_T时,指定仅导入需要的类型和过程,或对同名过程重命名区分:module Profile_Driver_Input ! 按需导入,对同名过程重命名区分 use LIST_T, only: LIST_DP_T, LIST_INT_T, AddItem_dp=>AddItem, SetP_dp=>SetP, AddItem_int=>AddItem, SetP_int=>SetP implicit none ! 后续业务代码 end module Profile_Driver_Input - 方案3:修改子模块默认可见性
给LIST_DP_T和LIST_INT_T模块添加private语句,仅把自定义列表类型、以及各自的通用接口设为public,Fortran编译器在同一作用域下遇到多个参数特征可区分的同名通用接口时,会自动合并接口,不会报冲突。
补充说明:如果你的AddItem、SetP本身就是子模块里定义的通用接口,且两个接口的参数特征(类型、秩、参数个数)完全可区分,也可以在LIST_T导入时直接合并,不需要额外重写通用接口块
内容的提问来源于stack exchange,提问作者Rami
相关产品推荐
相关产品推荐

