Конструктор структуры с приватным компонентом
Я определил структуру с частным компонентом в следующем примере:
module mtypes
implicit none
type mytype
integer, private :: nr
end type
end module mtypes
program main
use mtypes
type(mytype) :: t1
t1 = mytype(1)
print *, t1
end program main
Конструктор структуры вызывается с 1 в качестве аргумента. Насколько я понимаю, это не должно быть возможным, потому что nr
это личное. Тем не менее, это составлено Intel(R) Visual Fortran Compiler XE 14.0.5.239 [IA-32]
, но не с gfortran 4.9.3
с помощью cygwin
, Кроме того print
заявление показывает ценность nr
на выходе. Это действительно Fortran
определить структуру с частным компонентом таким образом, используя последний стандарт? Или это ошибка компилятора Intel?
1 ответ
В проекте Fortran 2008 конструкторы неявных (то есть тех, которые получены из определения производного типа) подробно описаны в 4.5.10. Есть одно ограничение:
Имя типа и все компоненты типа, для которого появляется спецификация компонента, должны быть доступны в области видимости, содержащей конструктор структуры.
Как компонент nr
недоступно в основной программе, это ограничение нарушается nr
как компонент-спец. Было бы хорошо использовать этот неявный конструктор структуры в модуле, как если бы он имел инициализацию по умолчанию для частного компонента.
По этой причине nagfor также жалуется на ваш пример кода.
На print
Заявление, это явно недействительно, и ifort 15 жалуется на это. За t1
чтобы появиться в списке вывода, вы должны использовать определенную процедуру вывода.