5

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

1 回答 1

4

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

两个虚拟参数是可区分的,如果 - 一个是过程,另一个是数据对象, - 它们都是数据对象或已知是函数,并且 TKR 与另一个不兼容, - 一个具有 ALLOCATABLE 属性,另一个具有POINTER 属性,或者 - 一个是具有非零秩的函数,另一个是未知函数。

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

于 2012-07-08T18:48:57.570 回答