Mam typ wyprowadzony (wrapper
) zawierający inny typ pochodny (over
). W tym ostatnim przypadku operator przypisania został przeciążony. Ponieważ przypisanie typów pochodnych odbywa się zgodnie z domyślnym podziałem na składniki, można oczekiwać, że przypisanie dwóch wystąpień wrapper
spowoduje w pewnym momencie wywołanie przeciążonego przypisania dla over
. Jednakże, używając poniższego programu, nie wydaje się, aby tak było. Przeciążone zadanie jest wywoływane tylko wtedy, gdy przeciążam zadanie przypisane do wrapper
, zawierające wyraźne przypisanie między instancjami over
(przez odkomentowanie skomentowanych linii kodu). Czemu? Uważam, że jest to trochę sprzeczne z intuicją. Czy istnieje sposób na uniknięcie przeciążenia w rodzaju owijania?Zagnieżdżony typ pochodny z przeciążonym przypisaniem
module test_module
implicit none
type :: over
integer :: ii = 0
end type over
type :: wrapper
type(over) :: myover
end type wrapper
interface assignment(=)
module procedure over_assign
!module procedure wrapper_assign
end interface assignment(=)
contains
subroutine over_assign(other, self)
type(over), intent(out) :: other
type(over), intent(in) :: self
print *, "Assignment of over called"
other%ii = -1
end subroutine over_assign
!subroutine wrapper_assign(other, self)
! type(wrapper), intent(out) :: other
! type(wrapper), intent(in) :: self
!
! other%myover = self%myover
!
!end subroutine wrapper_assign
end module test_module
program test
use test_module
implicit none
type(wrapper) :: w1, w2
print *, "Assigning wrapper instances:"
w2 = w1
end program test
Dziękuję bardzo Ian, nie wiedziałem o tych ograniczeniach dla wewnętrznego przypisania typów pochodnych. Twoja sugestia rzeczywiście działa. Niestety, kompilator, którego używam najbardziej, nie wydaje się poprawnie tego implementować, ponieważ nie wywołuje ono przypisania 'over', nawet jeśli deklaruję je jako procedurę typu type (zagram raport o błędzie). Ale inne kompilatory, które wypróbowałem, rzeczywiście robią to, co opisujesz. –
Czy naprawdę używasz poprawnej składni 'GENERIC :: ASSIGNMENT (=) => wrapper_assign'? –
@VladimirF: Tak, zgaduję, że tak. Zamieściłem swoje rozwiązanie tylko po to, aby uzupełnić wątek. Próbowałem NAG 5.3 i GFortran 4.9.0, oba z oczekiwanymi wynikami. Z kolei procesor Intel 13.1.3 kompiluje kod na podstawie skarg, ale przeciążone zadanie nie jest wywoływane podczas wykonywania programu. –