Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 在fortran 2003中,重载函数将指针返回到抽象接口旁边的基类型?_Oop_Fortran_Fortran2003 - Fatal编程技术网

Oop 在fortran 2003中,重载函数将指针返回到抽象接口旁边的基类型?

Oop 在fortran 2003中,重载函数将指针返回到抽象接口旁边的基类型?,oop,fortran,fortran2003,Oop,Fortran,Fortran2003,我正在用Fortran2003编写一个链表结构。此链接列表中的节点有两种类型,可以交替使用。该列表表示边的拓扑环,每条边由两个顶点限定,每个顶点连接到两条边。 这些结构被声明为抽象节点类型,并由两个子类VN_T和EN_T实现。VN_T指向两个EN_T,反之亦然。 由于列表在类型之间交替,指针存储在子类中。 我的问题是向VN_T和EN_T添加类型绑定函数(方法?),它们被称为NEXT()和PREV(),并且通过多态性做正确的事情。VN_T%NEXT()应跳过两个步骤,并获取下一个VN_T(由一个E

我正在用Fortran2003编写一个链表结构。此链接列表中的节点有两种类型,可以交替使用。该列表表示边的拓扑环,每条边由两个顶点限定,每个顶点连接到两条边。 这些结构被声明为抽象节点类型,并由两个子类VN_T和EN_T实现。VN_T指向两个EN_T,反之亦然。 由于列表在类型之间交替,指针存储在子类中。 我的问题是向VN_T和EN_T添加类型绑定函数(方法?),它们被称为NEXT()和PREV(),并且通过多态性做正确的事情。VN_T%NEXT()应跳过两个步骤,并获取下一个VN_T(由一个EN_T与开始的VN_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()
然后,我的编译器(英特尔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()
---------------------------^
基于此,这似乎表明它正在尝试调用基类上的下一个produre,而不是选择一个子类实现(它应该能够根据右侧节点1的具体类型来执行,对吗?)


我不熟悉F2003的OOP特性,所以我用JAVA制作了一个该模式的模型,我很满意地使用了它。有人能解释这是a)F2003的OOP行为的不同,2)编译器错误还是3)只是我的大脑死亡…

你可能需要更新你的编译器。正如本文所讨论的

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

更新到更新9包300允许编译这种用法,谢谢您的帮助。