Если я перегружаю конструктор данного типа, как в следующем примере, я получаю неоднозначный интерфейс. Поскольку у меня явно разные типы в интерфейсе, я не понимаю, почему он должен быть двусмысленным.
Я знаю, что у меня одинаковые имена в аргументах, и это может быть проблемой, если я хочу отправить с одинаковыми типами в другом порядке, но в моем случае это не должно быть проблемой.
module second_quantisation
implicit none
private
public :: SingleExc_t, SpinOrbIdx_t
!> We assume that Spin orbital indices are => 1, so set it to smth. arbitrary negative.
type :: SpinOrbIdx_t
integer :: val = -20
end type
type(SpinOrbIdx_t), parameter :: UNKNOWN = SpinOrbIdx_t()
!> Denotes an excitation from src -> tgt as [src, tgt]
type :: SingleExc_t
type(SpinOrbIdx_t) :: val(2, 1)
end type
type(SingleExc_t) :: exc
interface SingleExc_t
module procedure from_integer, from_SpinOrbIdx_t
end interface
contains
pure function from_integer(src, tgt) result(res)
integer, intent(in), optional :: src, tgt
type(SingleExc_t) :: res
if (present(src)) res%val(1, 1)%val = src
if (present(tgt)) res%val(2, 1)%val = tgt
end function
pure function from_SpinOrbIdx_t(src, tgt) result(res)
type(SpinOrbIdx_t), intent(in), optional :: src, tgt
type(SingleExc_t) :: res
if (present(src)) res%val(1, 1) = src
if (present(tgt)) res%val(2, 1) = tgt
end function
end module
program test_ambiguous_interface
use second_quantisation, only: SingleExc_t, SpinOrbIdx_t
implicit none
write(*, *) exc
write(*, *) SingleExc_t(1, 2)
write(*, *) SingleExc_t(SpinOrbIdx_t(1), SpinOrbIdx_t(2))
end program