1

编译器: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

现在,这不编译,抛出一个错误

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

在上面的第 5 行。为什么添加接口会报错?如何在 Fortran 中处理派生类型中的循环依赖关系,就像在 C++ 中使用前向类声明一样?

4

2 回答 2

2

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

我已经经历并看到其他人报告了 ifort 12.1.5 和程序员重写结构构造函数的问题(其中有一个具有派生类型结果的函数的通用接口,该接口与派生类型具有相同的名称 - 正如你这里有)。这种情况的解决方法是将构造函数的泛型接口(和后续引用)重命名为与派生类型不同的名称。

于 2012-07-18T01:46:59.843 回答
1

尽管 2003 听起来很久以前,但在大多数编译器中,fortran 2003 的实现仍然是一个持续的过程。在处理新功能时很可能仍然存在遗漏或错误。

如果这是一个已知问题,请与编译器的支持团队联系,如果是,是否有更新的版本可以解决此问题。

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

于 2012-07-18T01:47:30.140 回答