当我尝试将扩展类型的指针传递给一个带有指向父类型类的指针的例程时,我得到一个类型不匹配错误。但是,在伪参数不是指针的第二种情况下,它编译得很好。
child_type是一个parent_type类,它们都有指针属性,所以一切似乎都匹配,并且当伪参数不是指针时它起作用。
那么,如果伪参数是一个指针,为什么会失败呢?
module wrong_type_test
implicit none
type parent_type
integer :: a
end type parent_type
type, extends(parent_type) :: child_type
integer :: b
end type child_type
contains
subroutine ptr_test(parent_ptr)
class(parent_type), pointer, intent(inout) :: parent_ptr
print *, "test"
end subroutine ptr_test
subroutine non_ptr_test(parent)
class(parent_type), intent(inout) :: parent
print *, "test"
end subroutine non_ptr_test
end module wrong_type_test
program test
use wrong_type_test
implicit none
class(child_type), pointer :: child_ptr
call non_ptr_test(child_ptr) !this works
call ptr_test(child_ptr) !this doesn't work
end program test
ifort错误:
select_type_pointer_test.f90(33): error #6633: The type of the actual argument differs from the type of the dummy argument. [CHILD_PTR]
call ptr_test(child_ptr)
gfortran错误:
Error: Actual argument to 'parent_ptr' at (1) must have the same declared type
答案 0 :(得分:2)
在指针伪参数的情况下,该过程可以将指针重新关联到与实际参数具有不同扩展类型的对象。这不是一件明智的事情,所以语言禁止它。
通常,当您想要执行与参数的指针关联状态相关的操作时,伪参数应该只是指针。