0

我正在用 Fortran2003 编写一个链表结构。此链表中的节点有两种交替出现。该列表表示边的拓扑环,每条边由两个顶点界定,每个顶点连接到两条边。这些结构被声明为抽象 NODE_T 类型,并由两个子类 VN_T 和 EN_T 实现。一个 VN_T 指向两个 EN_T,反之亦然。由于列表在类型之间交替,因此指针存储在子类中。我的问题是将类型绑定函数(方法?)添加到称为 NEXT() 和 PREV() 的 VN_T 和 EN_T,并通过多态性做正确的事情。VN_T%NEXT() 应该跳过两个步骤,并获得下一个 VN_T(与开始的 VN_T 相隔一个 EN_T)。

我的类型/类定义如下:

TYPE, ABSTRACT :: NODE_T
  INTEGER :: IENT
  INTEGER :: ISIDE
  INTEGER :: ISUBTYPE
  INTEGER :: IPAD
CONTAINS
  PROCEDURE(NEXTA), DEFERRED :: NEXT
  PROCEDURE(PREVA), DEFERRED :: PREV
  END TYPE NODE_T

ABSTRACT INTERFACE
FUNCTION NEXTA(PENT)
IMPORT NODE_T
CLASS(NODE_T), POINTER :: NEXTA
CLASS(NODE_T) :: PENT
END FUNCTION

FUNCTION PREVA(PENT)
IMPORT NODE_T
CLASS(NODE_T), POINTER :: PREVA
CLASS(NODE_T) :: PENT
END FUNCTION
END INTERFACE

  TYPE, EXTENDS(NODE_T) :: VN_T
     DOUBLE PRECISION DT
     CLASS(EN_T), POINTER :: N
     CLASS(EN_T), POINTER :: P
     CONTAINS
      PROCEDURE :: NEXT => NEXTV
      PROCEDURE :: PREV => PREVV
  END TYPE

  TYPE, EXTENDS(NODE_T) :: EN_T
     CLASS(VN_T), POINTER :: N
     CLASS(VN_T), POINTER :: P
     CONTAINS
      PROCEDURE :: NEXT => NEXTE
      PROCEDURE :: PREV => PREVE
  END TYPE

next/prev 例程的实现都大同小异,next/prev 和 EN/VN 的四种组合:

FUNCTION NEXTE(PENT)
CLASS(NODE_T), POINTER :: NEXTE
CLASS(EN_T) PENT
NEXTE => PENT%N%N
END FUNCTION

当我调用这些函数时:

CLASS(NODE_T), POINTER :: NODE1, NODE2
NODE2 => NODE1%NEXT()

然后我的编译器(Intel FORTRAN XE Composer 2011,即 v12.0)抱怨消息

error #8314: If the rightmost part-name is of abstract type, data-ref shall be polymorphic   [NEXT]
            NODE2 => NODE1%NEXT()
---------------------------^

基于此文档似乎表明它正在尝试在类上调用 procdure NEXT 而不是选择其中一个子类实现(它应该能够根据右侧的 NODE1 的具体类型来执行此操作手边,对吧?)。

我是 F2​​003 的 OOP 功能的新手,所以我在 JAVA 中制作了这个模式的模型,我对它的工作感到满意。任何人都可以阐明这是否是a)F2003的OOP行为的差异,2)编译器错误或3)只是我脑残......

4

1 回答 1

1

您可能需要更新编译器。正如在这个线程中所讨论的

http://software.intel.com/en-us/forums/showthread.php?t=78855

Fortran 标准最初不允许直接调用抽象类型的类型绑定过程,而您正在尝试这样做。但是,标准已更改,现在应该已将其纳入英特尔 Fortran。

另一种方法是将基类修改为:

TYPE :: NODE_T
  INTEGER :: IENT
  INTEGER :: ISIDE
  INTEGER :: ISUBTYPE
  INTEGER :: IPAD
CONTAINS
  PROCEDURE :: NEXT
  PROCEDURE :: PREV
  END TYPE NODE_T
于 2012-04-25T23:26:19.600 回答