Расширенные типы 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 для правил области и имени).

Другие вопросы по тегам