"衍生类型在定义之前正在使用"在接口块中

时间:2016-07-02 19:17:39

标签: types fortran cygwin operator-keyword gfortran

在Windows上使用cygwin64,这个程序不会编译:

program test
  implicit none

  !define my type
  type myType
    real::foo
    integer::bar
  end type myType

  !define an operator for this type
  interface operator (>)
      logical function compare(a,b)
        type(myType),intent(in) :: a,b
        compare = a%foo>b%foo
      end function compare
  end interface operator (>)

  !simple example of operator usage
  type(myType) :: tfoo, tbar
  tfoo = card(1.,2); tbar = card(3.,4)
  print*, tfoo>tbar
end program test

gfortran(只有参数是" std = f2008")告诉我:

type(myType),intent(in) :: a,b
                    1
Error: Derived type ‘mytype’ at (1) is being used before it is defined

这让我很困惑,因为类型是在操作员之前定义的。我对Fortran比较新,所以这个示例代码可能会有更多错误。

同样的问题发生here,但将myType封装在一个单独的模块中并没有解决问题。

1 个答案:

答案 0 :(得分:7)

您的代码存在一些问题,但是这个特殊错误是因为myType在主机范围内,而不是在接口块中。解决方案是将派生类型放在链接线程中建议的单独模块中,或者import来自主机作用域单元的派生类型:

  interface operator (>)
      logical function compare(a,b)
        import myType
        type(myType),intent(in) :: a,b
      end function compare
  end interface operator (>)

这在Fortran 2008 Standard,Cl。中有所描述。 12.4.3.3“IMPORT声明”:

  

1 IMPORT语句指定可以在接口中访问主机作用域单元中的命名实体   身体由主人协会。以这种方式导入并在主机作用域单元中定义的实体应为   在接口体之前显式声明。

接口块可能没有包含可执行语句 - 因此您在那里的分配无效。此外,您的代码中未定义card