I would like to store a pointer to a function as an attribute w/in a type. But the compiler complains that the first argument to the function ought to be the type (like the self
or this
argument in languages like Python or C++). But the attribute is just a pointer - it is not part of the type.
Here is some code:
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
The actual error I get (ifort compiler) is:
error #8262: For a type-bound procedure that has the PASS binding attribute, the first dummy argument must have the same declared type as the type being defined.
I don't understand why it thinks that the interface I want to point to is a type-bound procedure.
Any hints?
You are, reasonably, misled by the wording of the error message as it relates to type-bound procedures. This is a problem of the error message itself which is unclear.
Your derived type has no binding.
However, the "passed-object dummy argument" concept applies to a procedure pointer component (which you do have) just as much as it does to type-bound procedures.
You should use the NOPASS
attribute when using procedure pointer components and type-bound procedures if you want to avoid the passed-object dummy.