我试图在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
这里有什么问题?
谢谢!
答案 0 :(得分:2)
通过将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