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