具有私有组件的结构构造函数

时间:2015-07-16 11:09:35

标签: fortran fortran2008

我在以下示例中定义了一个包含私有组件的结构:

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 个答案:

答案 0 :(得分:3)

在Fortran 2008的草案中,4.5.10中详细介绍了隐式(即来自派生类型定义的那些)结构构造函数。给出的一个约束是

  

在包含结构构造函数的作用域单元中,可以访问类型名称和组件规范出现的类型的所有组件。

由于在主程序中无法访问组件nr,因此nr作为组件规范会违反此约束。在模块中使用这个隐式结构构造函数就可以了,就像私有组件的默认初始化一样。

由于这个原因,nagfor还抱怨你的代码示例。

print声明中,这显然无效,ifort 15抱怨这一点。要使t1出现在输出列表中,必须使用define输出过程。