我正在尝试在Fortran中使用多态性,但是在分配类型时遇到问题。我不知道如何做到这一点。英特尔编译器抛出此错误:
error #6460: This is not a field name that is defined in the encompassing structure.
analitic%param%a0=2
---------------^
下面是一个最小示例:
program new
implicit none
integer, parameter :: dp = kind(1.0d0)
type :: potential
class(*),allocatable :: param
endtype
type(potential) :: analitic
type :: pa1d_param
real(dp) :: a0
real(dp) :: b0
end type
allocate(pa1d_param::analitic%param)
analitic%param%a0=2.0_dp
end program
这是怎么回事?
谢谢!
通过声明param
为 class(*)
,你声明了一个无限的多态对象。这些不能以正常方式引用 - 它们只能用作指针赋值中的实际参数、指针或目标,或用作select type
语句中的选择器(16.3.1,Fortran 95/2003 解释,Metcalf 和 Reid)。
为了按预期执行此操作,您必须以这种方式声明param
:(使用 ifort 12.0.2.137 编译并生成正确的输出)
program new
implicit none
integer, parameter :: dp = kind(1.0d0)
type pa1d_param
real(dp) :: a0
real(dp) :: b0
end type pa1d_param
type :: potential
class(pa1d_param),allocatable :: param
endtype
type(potential) :: analitic
allocate(analitic%param)
analitic%param%a0 = 2.0_dp
write(*,*)analitic%param%a0
end program