2

プロシージャをオーバーライドする際の引数の名前が、抽象インタフェースのものと一致する必要があるのはなぜですか?

TYPEそのような引数の、などがインターフェイスに一致する必要があることは明らかINTENTですが、なぜコンパイラは私が変数と呼ぶものを気にする必要があるのでしょうか?

EVAL以下では、倍精度の引数を取る単一の遅延プロシージャを含む単純な抽象ユーティリティ クラスを定義しました。

!------------------------------------- an abstract utility class !
type, abstract :: func_1d
contains
    procedure(interface_1d),deferred :: eval
end type func_1d

!-------------------------------------------- interface for eval !
abstract interface
function interface_1d(this,data) result(rval)
    import :: func_1d
    class(func_1d), intent(inout) :: this
    real*8        , intent(in)    :: data
    real*8 :: rval
end function interface_1d
end interface

のオーバーライド クラスと実装の定義EVAL:

type, extends(func_1d) :: foo
contains
    procedure, pass :: eval => eval_foo
end type foo

function eval_foo(this,another_variable_name) result(rval)
    implicit none
    class(foo), intent(inout) :: this
    real*8, intent(in) :: another_variable_name
    real*8 :: rval

    !! etc

end function eval_foo

から次のエラーが表示されgfortranます。

エラー: (1) の 'eval' のダミー引数 'another_variable_name' は、オーバーライドされたプロシージャの対応する引数と一致するように 'data' という名前にする必要があります

代わりDATAANOTHER_VARIABLE_NAMEすべてを代用すると、期待どおりにコンパイルおよび実行されます。

しかし、これはばかげているように思えます。複数回から継承できるようにしたいのですが、さまざまな状況下で、毎回FUNC_1D変数を呼び出さなければならないのはばかげているようです。DATA

コンパイラが引数のTYPEand以外に関心を持つべき理由がわかりません。INTENT

4

1 に答える 1