1

コンパイラ: ifort バージョン 12.1.5

Fortran コードを書いていて、F2003 の OOP 機能を利用したいのですが、つまずきにぶつかっています。例を要約すると、2 つの派生型 A と B が必要で、それぞれが他方のインスタンスへのポインターを持ちます。Fortran では、モジュール間の循環依存は明示的に禁止されているため、これら 2 つの型は同じモジュールに存在する必要があります。これはコンパイルされます:

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行目。インターフェイスを追加するとエラーがスローされるのはなぜですか? C++ で前方クラス宣言を使用するように、Fortran で派生型の循環依存をどのように処理しますか?

4

2 に答える 2

2

あなたのコードは正しい Fortran 2003 です。循環型の依存関係を正しい方法で処理しています。コンパイラにエラーがあります。

私は経験し、他の人がifort 12.1.5および構造コンストラクターのプログラマーオーバーライドに関する問題を報告しているのを見てきました(派生型の結果を持つ関数への汎用インターフェイスがあり、インターフェイスは派生型と同じ名前です-あなたのようにここにあります)。この状況の回避策として、コンストラクター関数のジェネリック インターフェイス (およびその後の参照) の名前を派生型とは異なる名前に変更します。

于 2012-07-18T01:46:59.843 に答える
1

2003 年はかなり前のことのように聞こえますが、ほとんどのコンパイラでは、fortran 2003 の実装がまだ進行中です。新機能の処理には、まだ省略やバグがある可能性があります。

これが既知の問題であるかどうか、コンパイラのサポート チームに確認してください。既知の問題である場合は、これを修正する新しいバージョンがあるかどうかを確認してください。

決定的ではありませんが、このコードが標準に準拠しているという証拠をサポートするものとして、gfortran はエラーなしでコンパイルします (関数の戻り値を設定しないことに関する 2 つの警告のみ)。

于 2012-07-18T01:47:30.140 に答える