我正在尝试编写一个泛型类型绑定过程,它将不同的回调函数作为参数。在编译以下代码时(使用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
答案 0 :(得分:3)
编译器是对的,因为Fortran 2008的 12.4.3.4.5对泛型声明的限制有
如果有两个伪参数可以区分 - 一个是程序,另一个是数据对象, - 它们都是数据对象或已知为函数,TKR与其他兼容, - 一个具有ALLOCATABLE属性,另一个具有POINTER属性,或 - 一个是具有非零等级的函数,另一个是未知的函数。
这意味着你的两个函数都是整数函数,因此无法区分。