具有私有组件的结构构造器
Structure constructor with private component
我在以下示例中定义了一个包含私有组件的结构:
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编译器的bug?
在Fortran 2008的草案中,4.5.10中详细介绍了隐式(即派生类型定义而来的)结构构造函数。给定的一个约束是
The type name and all components of the type for which a component-spec appears shall be accessible in the scoping unit containing the structure constructor.
由于组件 nr
在主程序中不可访问,因此将 nr
作为组件规范违反了此约束。在模块中使用此隐式结构构造函数会很好,私有组件具有默认初始化也是如此。
nagfor 也因此抱怨您的代码示例。
在 print
声明中,这显然是无效的,ifort 15 对此进行了抱怨。要使 t1
出现在输出列表中,您必须使用定义输出过程。
我在以下示例中定义了一个包含私有组件的结构:
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编译器的bug?
在Fortran 2008的草案中,4.5.10中详细介绍了隐式(即派生类型定义而来的)结构构造函数。给定的一个约束是
The type name and all components of the type for which a component-spec appears shall be accessible in the scoping unit containing the structure constructor.
由于组件 nr
在主程序中不可访问,因此将 nr
作为组件规范违反了此约束。在模块中使用此隐式结构构造函数会很好,私有组件具有默认初始化也是如此。
nagfor 也因此抱怨您的代码示例。
在 print
声明中,这显然是无效的,ifort 15 对此进行了抱怨。要使 t1
出现在输出列表中,您必须使用定义输出过程。