重载函数返回指向一个基本类型在旁边的Fortran 2003的抽象接口?(Overloaded fu

2019-09-16 17:48发布

我正在写在Fortran2003一个链表结构。 在这个链表中的节点有两个品种交替。 列表表示边缘的环拓扑,每个边缘是由两个顶点界定,且每一顶点连接到两个边缘。 这些结构被声明为抽象NODE_T类型,和由两个子类,VN_T和EN_T实现。 一个VN_T分两个EN_Ts,反之亦然。 由于类型之间的交替表,指针存储在子类。 我的问题是与添加型约束函数(方法?)来VN_T和EN_T被称为next()和prev(),并通过多态性做正确的事。 VN_T%NEXT()应该跳过两个步骤,并获得下一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

下一个/上一个例程的实现都大同小异,下一个/上和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()

然后我的编译器(英特尔Fortran XE作曲家2011年,即V12.0)与消息抱怨

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

其中在此基础上本文档似乎表明它正试图NEXT 类调用procdure而不是选择子类实现之一(它应能根据具体类型NODE1的是在右边做右手边,是吧?)。

我在F2003的OOP功能的新,所以我做了这个模式在JAVA中,我得到了工作,我满意的样机。 任何人都可以阐明这是否是或者a)在F2003的OOP活动的差异,2)编译器错误或3)只是我是新空房禁地......

Answer 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


文章来源: Overloaded functions returning pointers to a base type alongside an abstract interface in fortran 2003?