Gostaria de armazenar um ponteiro para uma função como um atributo c/em um tipo. Mas o compilador reclama que o primeiro argumento para a função deve ser o tipo (como o argumento self
or em linguagens como Python ou C++). Mas o atributo é apenas um ponteiro - nãothis
é parte do tipo.
Aqui está um código:
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
O erro real que recebo (compilador ifort) é:
erro #8262: Para um procedimento vinculado ao tipo que tem o atributo de vinculação PASS, o primeiro argumento fictício deve ter o mesmo tipo declarado que o tipo que está sendo definido.
Não entendo por que ele pensa que a interface para a qual quero apontar é um procedimento vinculado ao tipo.
Alguma dica?
Você está, razoavelmente, enganado pela formulação da mensagem de erro, pois ela se relaciona a procedimentos vinculados a tipos. Esse é um problema da própria mensagem de erro que não está claro.
Seu tipo derivado não tem vinculação.
Entretanto, o conceito de "argumento fictício de objeto passado" se aplica a um componente de ponteiro de procedimento (que você tem) tanto quanto a procedimentos vinculados a tipos.
Você deve usar o
NOPASS
atributo ao utilizar componentes de ponteiro de procedimento e procedimentos vinculados a tipos se quiser evitar o objeto fictício passado.