我想将函数的指针存储为类型中的属性。 但编译器抱怨函数的第一个参数应该是类型(就像 Python 或 C++ 等语言中的
self
或 this
参数)。 但属性只是一个指针 - 它不是类型的一部分。
这是一些代码:
module my_mod
implicit none
public :: my_type
abstract interface
! INTERFACE I WANT TO POINT TO
subroutine my_interface(arg)
real, intent(in) :: arg
end subroutine my_interface
end interface
type :: my_type
! MY TYPE DEFINITION
real :: my_variable
procedure(my_interface), pointer :: my_fn_pointer
end type my_type
interface my_type
! "CONSTRUCTOR" INTERFACE FOR MY TYPE
module procedure init_my_type
end interface
contains
type(my_type) function init_my_type(arg1, arg2)
! ACTUAL "CONSTRUCTOR" FOR MY TYPE
real, intent(in) :: arg1
procedure(my_interface) :: arg2
init_my_type%my_variable = arg1
init_my_type%my_fn_pointer => arg2
end function init_my_type
end module my_mod
我得到的实际错误(ifort 编译器)是:
错误 #8262:对于具有 PASS 绑定属性的类型绑定过程,第一个虚拟参数必须具有与定义的类型相同的声明类型。
有什么提示吗?
您有理由被错误消息的措辞误导,因为它与类型绑定过程相关。 这是错误信息本身的问题,不清楚。
您的派生类型没有绑定。
但是,“传递对象虚拟参数”概念适用于过程指针组件(您确实拥有),就像它适用于类型绑定过程一样。
如果您想避免传递对象虚拟,则在使用过程指针组件和类型绑定过程时应该使用
NOPASS
属性。