Я беру пример из «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
, так как это процедура привязки типа, но вторая должна быть 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