Общие процедуры с привязкой к типу с аргументами процедуры

Я пытаюсь написать общую процедуру с привязкой к типу, которая принимает различные функции обратного вызова в качестве параметров. При компиляции следующего кода (с помощью 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]

Кажется, что компилятор не делает различий между различными интерфейсами функций при использовании в качестве аргументов процедуры...

Мой вопрос: почему эти типы не проверяются и каков правильный, чистый способ написания общих процедур с привязкой к типу с процедурами или указателями процедур в качестве аргументов?

Возможное решение

Как отметил Владимир Ф., только возвращаемые аргументы функции обратного вызова проверяются по типу. В моем случае это нормально, чтобы потом немного изменить интерфейсы функций:

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 ответ

Решение

Компилятор прав, потому что 12.4.3.4.5 Fortran 2008 ограничения на общие объявления имеют

Два фиктивных аргумента различимы, если - один является процедурой, а другой - объектом данных, - они оба являются объектами данных или известны как функции, и ни один из них не совместим с другим TKR, - один имеет атрибут ALLOCATABLE, а другой - атрибут POINTER, или - один является функцией с ненулевым рангом, а другой неизвестен как функция.

Это означает, что обе ваши функции являются целочисленными, поэтому они не различимы.

Другие вопросы по тегам