我从 Metcalf 等人的“Fortran 95/2003 解释”中举了一个例子,因为我自己的代码针对的是同一件事。
type, abstract :: my_numeric_type
contains
private
procedure(op2), deferred :: add
generic, public :: operator(+) => add
end type
abstract interface
function op2(a,b) result (r)
import :: my_numeric_type
class(my_numeric type), intent(in) :: a,b
class(my_numeric type), allocatable :: r
end function op2
end interface
type, extends(my_numeric_type) :: my_integer
integer, private :: value
contains
procedure :: add => add_my_integer
end type
现在,我的问题是如何正确实现该add_my_integer
功能。似乎我不得不强制转换第一个参数,my_integer
因为它是一个类型绑定过程,但第二个参数my_numeric_type
必须符合抽象接口。至于结果,我应该分配r
给my_integer
吗?到目前为止,这是我想出的,它确实可以编译,但是一直检查类型似乎很奇怪,并且会导致分段错误(尽管可能是由于我的代码存在其他问题)。
function add_my_integer(a,b) result(r)
class(my_integer), intent(in) :: a
class(my_numeric_type), intent(in) :: b
class(my_numeric_type), allocatable :: r
allocate(my_integer :: r)
select type (b)
type is (my_integer)
r = a+b
end select
end function