【发布时间】:2015-03-02 20:13:40
【问题描述】:
我在使用新旧 Fortran 代码时遇到了一些问题。新部分是面向对象的,旧部分使用函数指针。
我的问题是,我想将一个成员函数分配给一个函数指针,以便该函数与这个特殊对象一起工作。下面是一个同样错误的示例代码:
module test
! abstract class
type, abstract :: base
contains
procedure (doSth), deferred :: doSomething
end type base
! deferred function
abstract interface
subroutine doSth(this)
import :: base
class(base) :: this
end subroutine
end interface
! derived class
type, extends(base) :: child
contains
procedure :: doSomething => do_Sth
end type child
contains
! deferred function implemented by child
subroutine do_Sth(this)
class(child) :: this
! ...
! ...
end subroutine
! function pointer to member function
subroutine get_functionPointer()
procedure() , pointer :: funcPtr
type (child), pointer :: childPtr
allocate (childPtr)
funcPtr => childPtr%doSomething
! ... This does not work
end subroutine
end module
这给了我错误信息:
error #8191: The procedure target must be a procedure or a procedure pointer.
有没有办法克服这个问题?
【问题讨论】:
-
Fortran 没有成员函数的概念 - 您试图将指针分配给 funcPtr 的东西是绑定。右侧相关过程的名称是
do_Sth。也许阅读this 的公认答案 - 当您分配过程指针而不是进行参数关联时,类似的规则会发挥作用。
标签: function pointers fortran abstract member