私自身のコードは同じことを目指しているので、Metcalfらが「Fortran 95/2003の説明」の例を取ります。抽象型を拡張する派生型の演算子をどのようにオーバーロードしますか?
type, abstract :: my_numeric_type
contains
private
procedure(op2), deferred :: add
generic, public :: operator(+) => add
end type
abstract interface
function op2(a,b) result (r)
import :: my_numeric_type
class(my_numeric type), intent(in) :: a,b
class(my_numeric type), allocatable :: r
end function op2
end interface
type, extends(my_numeric_type) :: my_integer
integer, private :: value
contains
procedure :: add => add_my_integer
end type
ここで私の質問は、add_my_integer
機能を正しく実装する方法です。タイプバインドされたプロシージャであるため、最初の引数をmy_integer
としてキャストするように強制されているようですが、2番目のメソッドは抽象インターフェイスに準拠するためにmy_numeric_type
でなければなりません。その結果、r
をmy_integer
に割り当てる必要がありますか?ここで私がこれまでに思いついたのはコンパイルされますが、常に型をチェックするのは奇妙に思えますし、(おそらく私のコードでは別の問題が原因で)セグメンテーションフォルトが発生します。
function add_my_integer(a,b) result(r)
class(my_integer), intent(in) :: a
class(my_numeric_type), intent(in) :: b
class(my_numeric_type), allocatable :: r
allocate(my_integer :: r)
select type (b)
type is (my_integer)
r = a+b
end select
end function
どのコンパイラを試しましたか? –
最新のifort。 – tiam