4

通常のプロシージャと遅延プロシージャの両方を 1 つの抽象型に混在させようとすると、gfortran は通常のプロシージャの呼び出しに失敗します。

    type, abstract  :: tBody
private
  ...
contains
  procedure                     :: init => new_Body
  ...
  procedure (contained), deferred   :: PointIn
end type tBody
abstract interface
  logical(LGT) pure function contained( Body, Point )
    import  :: tBody, tAffinePoint, LGT
    class(tBody), intent(IN)        :: Body
    type(tAffinePoint), intent(IN)  :: Point
  end function contained
end interface

subroutine newCuboid(  this, ... )
class(tCuboid), intent(OUT)     :: this
...

call this%tBody%init( ... )
....    [gfortran halts here]

end subroutine newCuboid

tBody 型を配置して、抽象化された遅延プロシージャと通常のインスタンス化されたプロシージャの両方を使用できるようにする方法はありますか?

4

1 に答える 1

5

いいえ。

簡単な解決策があります - に置き換えcall this%tBody%init(...)ますcall new_Body(...)(適切なアクセシビリティの変更が必要になる場合があります)。

おそらく弱い合理化 - 参照のタイプに基づいてプロシージャを解決していないため (ハードコードされているため)、タイプバインドプロシージャ構文を使用しないでください。

場合によっては、型の階層をさらに分割して、抽象型 tBody に「延期されていない」プロシージャの初期実装をホストする非抽象型の親を持たせるという別の解決策もあります。

于 2012-09-21T06:14:23.867 に答える