Oop 当类型名作为构造函数重载时,找不到fortran用户定义的类型

Oop 当类型名作为构造函数重载时,找不到fortran用户定义的类型,oop,constructor,fortran,Oop,Constructor,Fortran,我在这样的文件中写了一些代码 module ModuleBasicGeometry4 ... type TPoint ... end type TPoint interface TPoint module procedure :: TPointInit1,TPointInit2 end interface TPoint contains ... end module ModuleBasicGeometry

我在这样的文件中写了一些代码

module ModuleBasicGeometry4
    ...
    type TPoint
      ...
    end type TPoint

    interface TPoint
      module procedure :: TPointInit1,TPointInit2
    end interface TPoint

    contains
        ...
end module ModuleBasicGeometry4
在另一个文件中,我想使用用户定义的派生类型TPoint。我刚才使用了use语句:

... 
use ModuleBasicGeomentry4
type(TPoint) :: ...
...
但是,当我使用ifort2013_sp1.3.174编译这些文件时,它告诉我TPoint不是派生类型名,如果我删除了第一个文件中的接口语句,一切都正常。接口语句似乎屏蔽了类型语句,因为它们具有相同的名称。更奇怪的是,我还在同一个第一个文件中定义了许多其他派生类型和相应的接口作为它们的构造函数,它们都可以正常工作。那么是什么导致了这个奇怪的问题呢

附言。 我想我找到了一些原因,但我不知道为什么。我不是说其他类型的工作正常。在第二个文件中,因为我需要一些过程指针,所以我写了如下内容

...
interface
  ... function ...
      use MoudleBasicGeometry4
      ...
  end function ...
end interface
...

我发现只有在这个接口语句之前使用的类型才能正常工作。只要在此接口语句之后使用第一个文件中定义的类型,ifort编译器就会给出错误消息:这不是派生类型名。更重要的是,如果我在上面的接口语句中删除use ModuleBasicGeometry4语句,那么每件事都是可以的。有人能解释一下原因并告诉我如何解决这个问题吗?非常感谢。

从Fortran 2003开始,您可以在接口内部使用IMPORT语句来导入可在接口外部访问的实体,这样您就可以替换在这种情况下似乎有问题的use语句

我试图复制您的代码,以下代码使用gfortran-4.8正确编译

模块:

module ModuleBasicGeomentry4
  implicit none
  type TPoint
     integer :: a
     integer :: b
   end type TPoint

   interface TPoint
     module procedure :: TPointInit1,TPointInit2
   end interface TPoint

   contains
     function TPointInit1(a) result(point)
        integer, intent(in)  :: a
        type(TPoint)         :: point
        point%a = a
        point%b = a
     end function
      function TPointInit2(a,b) result(point)
        integer, intent(in)  :: a,b
        type(TPoint)         :: point
        point%a = a
        point%b = b
     end function
end module ModuleBasicGeomentry4
主要内容:


我试过你的建议,但在你和ifort的案例中确实有效。不幸的是,它在我的情况下不起作用。不同的是,我的第二个文件也是一个模子。当我用import语句替换有问题的use语句以使用第一个文件中定义的派生类型时,import语句本身似乎不会导致任何错误,但当我使用导入的类型声明变量时,编译器会告诉我尚未声明此派生类型名。但是,在同一个第二个文件中定义的类型可以正确导入和使用。如果没有实际的代码,我不能告诉您更多信息,只能使用-warn all进行编译。我不知道该说什么…似乎import语句突然间一切正常。非常感谢你。
PROGRAM main
  use ModuleBasicGeomentry4, only : Tpoint
  implicit none

  type(Tpoint) :: point1
  interface
     integer function foo(point)
        import Tpoint
        type(Tpoint)     :: point
     end function
  end interface
  type(Tpoint)   :: point2  

  point1 = Tpoint(1)
  point2 = Tpoint(1,2)

  print*, foo(point1)
  print*, foo(point2)
END PROGRAM main

integer function foo(point)
  use ModuleBasicGeomentry4 , only : Tpoint
  type(Tpoint)     :: point
  foo = point%a + point%b
end function