This question already has answers here:
Why is the type not accessible?

(2 个回答)


4年前关闭。




在 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 封装在单独的模块中并没有解决问题。

最佳答案

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

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

Fortran 2008 标准,Cl 中对此进行了描述。 12.4.3.3“导入语句”:



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

10-08 12:35