Как прокомментировал IanH , описывая выбранный вами подход, текущая версия gfortran
не поддерживает определение неограниченного полиморфного компонента с помощью конструктора структуры
container(b_obj)
это такая вещь.Таким образом, оставляя в стороне вопрос о том, по-прежнему ли вы сталкиваетесь с этой проблемой, можно по-прежнему интересоваться разрешением использовать код более старым версиям / другим компиляторам.
Альтернативный подход состоит в том, чтобы не использовать конструктор для элементаваш контейнер.Вместо этого один компонент может быть представлен непосредственно в присваивании:
use m
type(container) a_arr(3) ! Not polymorphic...
a_arr%ptr = b(1) ! ... so it has component ptr in its declared type
end mwe
Естественно, у нас все еще есть компонент типа контейнера, полиморфный, поэтому любые попытки ссылаться / определять / и т. Д., Этот компонент будетс учетом этих различных ограничений.В вашем вопросе у вас есть компонент unlimited polymorphic, но я вижу, что вы сначала говорите об ограничении рассмотрения контейнера элементами, которые расширяют первый тип.Вместо того, чтобы объявлять контейнерный компонент как неограниченный полиморфный, он может быть гораздо полезнее объявленного типа a
:
type :: container
class(a), allocatable :: ptr
end type
Это будет достаточно для решения проблемы с
do i=1,3
write(*,*) a_arr(i)%ptr%num
end do
, потому чтоnum
является компонентом объявленного типа a_arr(i)%ptr
(то есть. a
).В общем, это не полное решение, потому что
do i=1,3
write(*,*) a_arr(i)%ptr%num_of_type_b
end do
не будет работать (с num_of_type_b
компонентом в расширяющем типе).Здесь вы должны использовать обычные приемы (определенный ввод / вывод, динамическое разрешение, select type
и т. Д.).Они выходят за рамки этого ответа, и многие другие вопросы можно найти по ним.