Необъяснимый неоднозначный интерфейс

Если я перегружаю конструктор данного типа, как в следующем примере, я получаю неоднозначный интерфейс. Поскольку у меня явно разные типы в интерфейсе, я не понимаю, почему он должен быть двусмысленным.

Я знаю, что у меня одинаковые имена в аргументах, и это может быть проблемой, если я хочу отправить с одинаковыми типами в другом порядке, но в моем случае это не должно быть проблемой.

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


person mcocdawc    schedule 27.05.2020    source источник
comment
Необязательный означает, что они нечетко различимы. Рассмотрим случай, когда вы опускаете оба фактических аргумента   -  person Ian Bush    schedule 27.05.2020
comment
Конечно. Мой плохой, спасибо.   -  person mcocdawc    schedule 27.05.2020