Расширенные типы Fortran по различным модулям
С расширенными типами в Фортране должен быть закрытый компонент, видимый расширению типа в другом модуле.
И с gcc4.7, и с ifort следующий код приводит к ошибке, поскольку bName имеет как начальный тип, так и расширение. Но так как он приватный, он не доступен в расширении другого модуля, т. Е. Если вы закомментируете bName в bar_type, вы получите ошибку, что это приватно.
module foo
type :: foo_type
character(256),private :: bName = "foo"
contains
procedure :: pName => pName
end type
contains
subroutine pName(this)
class(foo_type), intent(in) :: this
print*,trim(this%bName)
end subroutine
end module
module bar
use foo, only : foo_type
type,extends(foo_type) :: bar_type
character(256),private :: bName = "bar"
contains
procedure :: pName => pName
end type
contains
subroutine pName(this)
class(bar_type), intent(in) :: this
print*,this%bName
end subroutine
end module
program test
use foo, only : foo_type
use bar, only : bar_type
type(foo_type) :: foo_inst
type(bar_type) :: bar_inst
call foo_inst%pName()
call bar_inst%pName()
end program
Если bar_type содержится в том же модуле, что и foo_type, то bName будет доступен из bar_type, т. Е. Следующий код будет скомпилирован
module foo
type :: foo_type
character(256),private :: bName = "foo"
contains
procedure :: pName => pName
end type
type, extends(foo_type) :: baz_type
contains
procedure :: pName => pName_baz
end type
contains
subroutine pName_baz(this)
class(baz_type), intent(in) :: this
print*,trim(this%bName)
end subroutine
subroutine pName(this)
class(foo_type), intent(in) :: this
print*,trim(this%bName)
end subroutine
end module
program test
use foo, only : foo_type,baz_type
type(foo_type) :: foo_inst
type(baz_type) :: baz_inst
call foo_inst%pName()
call baz_inst%pName()
end program
Трудно было разобрать стандарты, чтобы понять, что должно произойти в первом примере.
1 ответ
Я считаю, что первый пример не соответствует стандартам.
Хотя частный атрибут делает компонент bName
недоступный внешний модуль foo
, он все еще наследуется bar_type
(возможно, довольно бессмысленно, потому что с этим ничего не поделаешь, но это не проблема) - см. Примечание 4.51 в f2003:
Недоступные компоненты и привязки родительского типа также наследуются, но они остаются недоступными в расширенном типе. Недоступные сущности возникают, если доступ к расширяемому типу осуществляется через ассоциацию использования и имеет частную сущность.
Так bar_type
имеет унаследованный компонент с именем bName
, что делает ошибкой добавление другого компонента с таким именем (см. параграф 16.2 для правил области и имени).