Я пытаюсь использовать функцию pack для массива пользовательских типов.Я настроил небольшой модуль с типом и интерфейсом для перегрузки .eq.
.Если я делаю простое сравнение, перегруженный оператор, кажется, работает, однако при использовании в контексте функции пакета я получаю сообщение об ошибке.
!The module
module m_types
type :: t_property
character(12) :: key
logical :: value
end type t_property
type(t_property), allocatable, dimension(:) :: properties
public :: operator(.eq.)
interface operator(.eq.)
procedure prop_eq
end interface operator(.eq.)
contains
pure function prop_eq(first, second) result(res)
type(t_property), intent(in) :: first, second
logical :: res
if (first%key .eq. second%key) then
res = .true.
else
res = .false.
end if
end function prop_eq
end module m_types
! The test program
program textadventure
use m_types
implicit none
type(t_property) :: temp
allocate(properties(0))
temp = t_property(key="lit", value=.true.)
properties = [properties, temp]
temp = t_property(key="visited", value=.false.)
properties = [properties, temp]
temp = t_property(key="lit", value=.false.)
properties = [properties, temp]
temp = t_property(key="cold", value=.false.)
properties = [properties, temp]
temp = t_property(key="cold", value=.false.)
properties = [properties, temp]
print *, properties
print *, (properties(4) .eq. temp) ! Succeeds
print *, size(pack(properties, properties .eq. temp)) ! Fails
deallocate(properties)
end program textadventure
Сообщение об ошибке GCC
Error: Operands of comparison operator ‘.eq.’ at (1) are TYPE(t_property)/TYPE(t_property)
Спецификация говорит, что маска в PACK
должна быть логическим скаляром, который, как я думал, я предоставил - кто-то может указать, где я ошибаюсь?