我正在尝试编写一个通用类型绑定过程,该过程将不同的回调函数作为参数。编译以下代码(使用 ifort 12.1.3)时,我收到以下警告:
module test
type :: a_type
contains
procedure :: t_s => at_s
procedure :: t_d => at_d
generic :: t => t_s,t_d
end type a_type
abstract interface
integer function cb_s(arg)
real(4) :: arg
end function cb_s
integer function cb_d(arg)
real(8) :: arg
end function cb_d
end interface
contains
subroutine at_s(this,cb)
class(a_type) :: this
procedure(cb_s) :: cb
end subroutine
subroutine at_d(this,cb)
class(a_type) :: this
procedure(cb_d) :: cb
end subroutine
end module test
警告:
compileme.f(27): warning #8449: The type/rank/keyword signature for this specific
procedure matches another specific procedure that shares the same generic
binding name. [AT_D]
当用作过程参数时,编译器似乎没有区分不同的函数接口......
我的问题是:为什么不检查这些类型,以及用过程或过程指针作为参数编写泛型类型绑定过程的正确、干净的方法是什么?
可能的解决方案
正如 Vladimir F 所指出的,只有回调函数的返回参数是类型检查的。就我而言,只需稍微更改函数的接口即可:
abstract interface
real(4) function cb_s(arg)
real(4) :: arg
end function cb_s
real(8) function cb_d(arg)
real(8) :: arg
end function cb_d
end interface