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]

プロシージャの引数として使用する場合、コンパイラは異なる関数インターフェイスを区別していないようです...

私の質問は次のとおりです。これらの型がチェックされないのはなぜですか。また、引数としてプロシージャまたはプロシージャポインタを使用して、ジェネリック型にバインドされたプロシージャを作成するための正しいクリーンな方法は何ですか。

考えられる解決策

ウラジミール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 ジェネリック宣言の制限に

2 つの仮引数は、次の場合に区別できます - 一方がプロシージャーで、もう一方がデータ オブジェクトである - それらが両方ともデータ オブジェクトであるか関数であることがわかっており、どちらも TKR と互換性がない- 1 つが ALLOCATABLE 属性を持ち、もう 1 つが ALLOCATABLE 属性を持っているPOINTER 属性、または - 1 つはゼロ以外のランクを持つ関数であり、もう 1 つは関数であることがわかっていません。

これは、両方の関数が整数関数であるため、区別できないことを意味します。

于 2012-07-08T18:48:57.570 に答える