Fortran OOP循环依赖处理,接口

时间:2012-07-17 23:44:13

标签: oop constructor module fortran circular-dependency

编译器:ifort版本12.1.5

我正在编写一些Fortran代码,我想使用一些F2003 OOP功能,但我遇到了一些绊脚石。减少示例,我希望有两个派生类型A和B,每个类型都有一个指向另一个实例的指针。在Fortran中,明确禁止模块之间的循环依赖,因此这两种类型必须驻留在同一模块中。这编译:

module testModule
implicit none

type A
 type(B),pointer :: b1
end type A

type B
 type(A),pointer :: a1
end type B

contains
[some possibly type-bound procedures]
end module

现在,我想为这些类型实现一些构造函数,并尝试以下代码:

module testModule
implicit none

type A
 type(B),pointer :: b1
end type A

interface A
 module procedure A_ctor
end interface

type B
 type(A),pointer :: a1
end type B

interface B
 module procedure B_ctor
end interface

contains
function A_ctor()
 type(A),target :: A_ctor
end function
function B_ctor()
 type(B),target :: B_ctor
end function
end module

现在,这不会编译,抛出错误

  

这不是派生类型名称。 [B]

在第5行上面。为什么添加接口会引发错误?如何在Fortran中处理派生类型中的循环依赖,因为在C ++中会使用前向类声明?

2 个答案:

答案 0 :(得分:2)

您的代码是正确的Fortran 2003.您正在以正确的方式处理循环类型依赖项。编译器出错了。

我经历过并见过其他人报告ifort 12.1.5的问题以及结构构造函数的程序员覆盖(其中存在具有派生类型结果的函数的泛型接口,其中接口与派生类型具有相同的名称 - 就像你在这里一样)。此情况的解决方法是将构造函数的通用接口(和后续引用)重命名为与派生类型不同的名称。

答案 1 :(得分:1)

尽管2003年很久以前就发生了声音,但在大多数编译器中,fortran 2003的实施仍然是一个持续的过程。处理新功能时可能仍有遗漏或漏洞。

如果这是一个已知问题,请咨询您的编译器的支持团队,如果有,请检查是否有更新的版本修复此问题。

作为支持 - 尽管不是决定性的 - 证明此代码符合标准,gfortran编译它没有错误(只有两个关于不为函数设置返回值的警告)。