Fortran90面向对象编程中dp变量歧义编译错误求助
解决Fortran中
dp命名歧义的编译错误 你遇到的编译错误核心原因很明确:dp这个参数名在主程序和你引入的class_Rectangle模块中被重复定义了。Fortran的名字查找规则会把模块导出的名字和主程序本地定义的名字视为冲突,编译器无法判断你在主程序里使用的dp到底指向哪一个,所以抛出了“ambiguous reference”的错误。
这里有两种清晰的解决方案:
方案1:移除主程序中重复的dp定义
因为你已经通过use class_Rectangle引入了模块里的dp参数,主程序可以直接使用它,完全不需要再重新定义一遍。修改后的主程序代码如下:
program Main use class_Rectangle use class_Circle implicit none interface compute_area module procedure area_rectangle, area_circle end interface compute_area type(Rectangle) :: geoA type(Circle) :: geoB real(dp) :: area ! 直接使用class_Rectangle模块导出的dp geoA = Rectangle(2.0d0,4.0d0) call area_rectangle(area,geoA) write(*,*) 'Rectangle area:', area geoB = Circle(1.0d0) call area_circle(area,geoB) write(*,*) 'Circle area:',area end program Main
方案2:创建公共的种类参数模块(推荐)
如果你的项目里有多个模块需要使用双精度类型参数,更规范的做法是把dp这类类型参数单独放在一个公共模块里,所有需要的模块和主程序都引入这个模块。这种方式能避免重复定义,也让后续的精度调整更方便。
首先创建一个kinds模块:
module kinds implicit none integer, parameter :: dp = selected_real_kind(15,307) end module kinds
然后修改class_Rectangle模块,引入这个公共模块:
module class_Rectangle use kinds implicit none type Rectangle real(dp) :: a,b end type Rectangle contains subroutine area_rectangle(area,info) implicit none real(dp), intent(out) :: area type(Rectangle), intent(in) :: info area = info%a * info%b end subroutine area_rectangle end module class_Rectangle
最后修改主程序(这里可以选择直接引入kinds模块,或者继续引入class_Rectangle——因为它已经导入了kinds,dp会被间接导出):
program Main use kinds use class_Rectangle use class_Circle implicit none interface compute_area module procedure area_rectangle, area_circle end interface compute_area type(Rectangle) :: geoA type(Circle) :: geoB real(dp) :: area geoA = Rectangle(2.0d0,4.0d0) call area_rectangle(area,geoA) write(*,*) 'Rectangle area:', area geoB = Circle(1.0d0) call area_circle(area,geoB) write(*,*) 'Circle area:',area end program Main
这样修改后,编译器就能明确dp的来源,不会再出现歧义引用的错误,同时代码的结构也更清晰、更易于维护。
内容的提问来源于stack exchange,提问作者Andres Valdez
相关产品推荐
相关产品推荐

