带有过程参数的通用类型绑定过程

时间:2012-07-08 13:45:20

标签: fortran fortran2003

我正在尝试编写一个泛型类型绑定过程,它将不同的回调函数作为参数。在编译以下代码时(使用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

1 个答案:

答案 0 :(得分:3)

编译器是对的,因为Fortran 2008的 12.4.3.4.5对泛型声明的限制

  

如果有两个伪参数可以区分    - 一个是程序,另一个是数据对象,    - 它们都是数据对象或已知为函数,TKR与其他兼容,    - 一个具有ALLOCATABLE属性,另一个具有POINTER属性,或    - 一个是具有非零等级的函数,另一个是未知的函数。

这意味着你的两个函数都是整数函数,因此无法区分。